1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
| #include <SDL.h>
#define PCM_BUFFER_SIZE (1024 * 2 * 2 * 2)
static uint8_t* sAudioBuf = NULL; static uint8_t* sAudioPos = NULL; static uint8_t* sAudioEnd = NULL;
void onFillAudioPcm(void* userdata, uint8_t* stream, int len) { SDL_memset(stream, 0, len);
if (sAudioPos >= sAudioEnd) { return; }
int remainBufLen = (int)(sAudioEnd - sAudioPos); len = (len < remainBufLen) ? len : remainBufLen;
SDL_MixAudio(stream, sAudioPos, len, SDL_MIX_MAXVOLUME / 8); printf("[onFillAudioPcm] len: %d\n", len); sAudioPos += len; }
int main(int argc, char* argv[]) { FILE* audio = NULL; const char* audioPath = "44100_16bit_2ch.pcm";
if (SDL_Init(SDL_INIT_AUDIO)) { printf("Could not initialize SDL - %s\n", SDL_GetError()); return -1; }
fopen_s(&audio, audioPath, "rb"); if (!audio) { printf("Failed to open pcm file.\n"); goto END; }
sAudioBuf = (uint8_t*)malloc(PCM_BUFFER_SIZE);
SDL_AudioSpec audioSpec; audioSpec.freq = 44100; audioSpec.format = AUDIO_S16SYS; audioSpec.channels = 2; audioSpec.samples = 1024; audioSpec.callback = onFillAudioPcm; audioSpec.userdata = NULL; if (SDL_OpenAudio(&audioSpec, NULL)) { printf("Failed to open audio device - %s\n", SDL_GetError()); goto END; }
SDL_PauseAudio(0);
size_t dataCount = 0; while (1) { size_t readBufLen = fread(sAudioBuf, 1, PCM_BUFFER_SIZE, audio); if (readBufLen <= 0) { break; }
dataCount += readBufLen; printf("Now palying %10zu bytes.\n", dataCount); sAudioEnd = sAudioBuf + readBufLen; sAudioPos = sAudioBuf;
while (sAudioPos < sAudioEnd) { SDL_Delay(2); } } printf("Play over.\n"); SDL_CloseAudio();
END: if (audio) { fclose(audio); } if (sAudioBuf) { free(sAudioBuf); } SDL_Quit();
return 0; }
|