static DWORD WINAPI SoundThread(LPVOID arg) { do { for (WAVEHDR *hdr = _wave_hdr; hdr != endof(_wave_hdr); hdr++) { if ((hdr->dwFlags & WHDR_INQUEUE) != 0) continue; MxMixSamples(hdr->lpData, hdr->dwBufferLength / 4); if (waveOutWrite(_waveout, hdr, sizeof(WAVEHDR)) != MMSYSERR_NOERROR) { MessageBox(NULL, _T("Sounds are disabled until restart."), _T("waveOutWrite failed"), MB_ICONINFORMATION); return 0; } } WaitForSingleObject(_event, INFINITE); } while (_waveout != NULL); return 0; }
void SoundDriver_Allegro::MainLoop() { /* We haven't opened a stream yet */ if (_stream == NULL) return; void *data = get_audio_stream_buffer(_stream); /* We don't have to fill the stream yet */ if (data == NULL) return; /* Mix the samples */ MxMixSamples(data, _buffer_size); /* Allegro sound is always unsigned, so we need to correct that */ uint16 *snd = (uint16*)data; for (int i = 0; i < _buffer_size * 2; i++) snd[i] ^= 0x8000; /* Tell we've filled the stream */ free_audio_stream_buffer(_stream); }
static void CDECL fill_sound_buffer(void *userdata, Uint8 *stream, int len) { MxMixSamples(stream, len / 4); }