comparison render_sdl.c @ 1552:13a82adb185b

Add support for float32 format audio samples
author Michael Pavone <pavone@retrodev.com>
date Wed, 28 Mar 2018 23:56:38 -0700
parents ce1f93be0104
children 6ce36c3f250b
comparison
equal deleted inserted replaced
1551:ce1f93be0104 1552:13a82adb185b
55 }; 55 };
56 56
57 static audio_source *audio_sources[8]; 57 static audio_source *audio_sources[8];
58 static uint8_t num_audio_sources; 58 static uint8_t num_audio_sources;
59 59
60 typedef void (*mix_func)(audio_source *audio, void *vstream, int len);
61
62 static void mix_s16(audio_source *audio, void *vstream, int len)
63 {
64 int samples = len/(sizeof(int16_t)*2);
65 int16_t *stream = vstream;
66 int16_t *end = stream + 2*samples;
67 int16_t *src = audio->front;
68 if (audio->num_channels == 1) {
69 for (int16_t *cur = stream; cur < end;)
70 {
71 *(cur++) += *src;
72 *(cur++) += *(src++);
73 }
74 } else {
75 for (int16_t *cur = stream; cur < end;)
76 {
77 *(cur++) += *(src++);
78 *(cur++) += *(src++);
79 }
80 }
81 }
82
83 static void mix_f32(audio_source *audio, void *vstream, int len)
84 {
85 int samples = len/(sizeof(float)*2);
86 float *stream = vstream;
87 float *end = stream + 2*samples;
88 int16_t *src = audio->front;
89 if (audio->num_channels == 1) {
90 for (float *cur = stream; cur < end;)
91 {
92 *(cur++) += ((float)*src) / 0x7FFF;
93 *(cur++) += ((float)*(src++)) / 0x7FFF;
94 }
95 } else {
96 for (float *cur = stream; cur < end;)
97 {
98 *(cur++) += ((float)*(src++)) / 0x7FFF;
99 *(cur++) += ((float)*(src++)) / 0x7FFF;
100 }
101 }
102 }
103
104 static void mix_null(audio_source *audio, void *vstream, int len)
105 {
106 }
107
108 static mix_func mix;
109
60 static void audio_callback(void * userdata, uint8_t *byte_stream, int len) 110 static void audio_callback(void * userdata, uint8_t *byte_stream, int len)
61 { 111 {
62 int16_t * stream = (int16_t *)byte_stream; 112 //int16_t * stream = (int16_t *)byte_stream;
63 int samples = len/(sizeof(int16_t)*2); 113 //int samples = len/(sizeof(int16_t)*2);
64 uint8_t num_populated; 114 uint8_t num_populated;
65 memset(stream, 0, len); 115 memset(byte_stream, 0, len);
66 SDL_LockMutex(audio_mutex); 116 SDL_LockMutex(audio_mutex);
67 do { 117 do {
68 num_populated = 0; 118 num_populated = 0;
69 for (uint8_t i = 0; i < num_audio_sources; i++) 119 for (uint8_t i = 0; i < num_audio_sources; i++)
70 { 120 {
75 if (!quitting && num_populated < num_audio_sources) { 125 if (!quitting && num_populated < num_audio_sources) {
76 SDL_CondWait(audio_ready, audio_mutex); 126 SDL_CondWait(audio_ready, audio_mutex);
77 } 127 }
78 } while(!quitting && num_populated < num_audio_sources); 128 } while(!quitting && num_populated < num_audio_sources);
79 if (!quitting) { 129 if (!quitting) {
80 int16_t *end = stream + 2*samples; 130 //int16_t *end = stream + 2*samples;
81 for (uint8_t i = 0; i < num_audio_sources; i++) 131 for (uint8_t i = 0; i < num_audio_sources; i++)
82 { 132 {
83 int16_t *src = audio_sources[i]->front; 133 mix(audio_sources[i], byte_stream, len);
134 /*int16_t *src = audio_sources[i]->front;
84 if (audio_sources[i]->num_channels == 1) { 135 if (audio_sources[i]->num_channels == 1) {
85 for (int16_t *cur = stream; cur < end;) 136 for (int16_t *cur = stream; cur < end;)
86 { 137 {
87 *(cur++) += *src; 138 *(cur++) += *src;
88 *(cur++) += *(src++); 139 *(cur++) += *(src++);
91 for (int16_t *cur = stream; cur < end;) 142 for (int16_t *cur = stream; cur < end;)
92 { 143 {
93 *(cur++) += *(src++); 144 *(cur++) += *(src++);
94 *(cur++) += *(src++); 145 *(cur++) += *(src++);
95 } 146 }
96 } 147 }*/
97 audio_sources[i]->front_populated = 0; 148 audio_sources[i]->front_populated = 0;
98 SDL_CondSignal(audio_sources[i]->cond); 149 SDL_CondSignal(audio_sources[i]->cond);
99 } 150 }
100 } 151 }
101 SDL_UnlockMutex(audio_mutex); 152 SDL_UnlockMutex(audio_mutex);
554 if (SDL_OpenAudio(&desired, &actual) < 0) { 605 if (SDL_OpenAudio(&desired, &actual) < 0) {
555 fatal_error("Unable to open SDL audio: %s\n", SDL_GetError()); 606 fatal_error("Unable to open SDL audio: %s\n", SDL_GetError());
556 } 607 }
557 buffer_samples = actual.samples; 608 buffer_samples = actual.samples;
558 sample_rate = actual.freq; 609 sample_rate = actual.freq;
559 printf("Initialized audio at frequency %d with a %d sample buffer\n", actual.freq, actual.samples); 610 printf("Initialized audio at frequency %d with a %d sample buffer, ", actual.freq, actual.samples);
611 if (actual.format == AUDIO_S16SYS) {
612 puts("signed 16-bit int format");
613 mix = mix_s16;
614 } else if (actual.format == AUDIO_F32SYS) {
615 puts("32-bit float format");
616 mix = mix_f32;
617 } else {
618 printf("unsupported format %X\n", actual.format);
619 warning("Unsupported audio sample format: %X\n", actual.format);
620 mix = mix_null;
621 }
560 SDL_PauseAudio(0); 622 SDL_PauseAudio(0);
561 623
562 uint32_t db_size; 624 uint32_t db_size;
563 char *db_data = read_bundled_file("gamecontrollerdb.txt", &db_size); 625 char *db_data = read_bundled_file("gamecontrollerdb.txt", &db_size);
564 if (db_data) { 626 if (db_data) {