Mercurial > repos > blastem
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) { |