BOOL WinSound::start(USER_CALLBACK pUserCallback) { userCallback = pUserCallback; // bufferSize is number of bytes per buffer bufferSize = (((WINSOUND_BUFFERLEN * WINSOUND_RATE) / 1000) * WINSOUND_SAMPLE_BYTES * WINSOUND_CHANNELS) / WINSOUND_BUFFERCOUNT; WAVEFORMATEX wfx; wfx.wFormatTag = WAVE_FORMAT_PCM; wfx.nChannels = WINSOUND_CHANNELS; wfx.nSamplesPerSec = WINSOUND_RATE; wfx.wBitsPerSample = WINSOUND_CHANNEL_DEPTH; wfx.nBlockAlign = wfx.nChannels * WINSOUND_SAMPLE_BYTES; wfx.nAvgBytesPerSec = wfx.nBlockAlign + wfx.nSamplesPerSec; wfx.cbSize = 0; MMRESULT errCode = waveOutOpen(&waveOut, WAVE_MAPPER, &wfx, (DWORD) waveOutProc, (DWORD) this, (DWORD) CALLBACK_FUNCTION); if (errCode != MMSYSERR_NOERROR) { return FALSE; } int i; for (i = 0; i < WINSOUND_BUFFERCOUNT; i++) { soundBuffer[i] = malloc(bufferSize); memset(&waveHeader[i], 0, sizeof(WAVEHDR)); } // Fill all the sound buffers currentBuffer = 0; isStarted = TRUE; for (i = 0; i < WINSOUND_BUFFERCOUNT; i++) { fillNextBuffer(); } return TRUE; }
void updatePlayback() { for(int i=0; i<BufferCount; i++){ if(! _buffers[i].isUsed){ //printf("%c", 'A'+i); fillNextBuffer(_buffers[i].samples); writeBuffer(&_buffers[i]); } } }
bool CMMSoundSubSystem::open(USER_CALLBACK pUserCallback,long totalBufferedSoundLen) { m_pUserCallback = pUserCallback; m_bufferSize = ((totalBufferedSoundLen * REPLAY_RATE) / 1000) * REPLAY_SAMPLELEN; m_bufferSize /= REPLAY_NBSOUNDBUFFER; WAVEFORMATEX wfx; wfx.wFormatTag = 1; // PCM standart. wfx.nChannels = 2; // Mono wfx.nSamplesPerSec = REPLAY_RATE; wfx.nAvgBytesPerSec = REPLAY_RATE*REPLAY_SAMPLELEN; wfx.nBlockAlign = REPLAY_SAMPLELEN; wfx.wBitsPerSample = REPLAY_DEPTH; wfx.cbSize = 0; MMRESULT errCode = waveOutOpen( &m_hWaveOut, WAVE_MAPPER, &wfx, (DWORD)waveOutProc, (DWORD)this, // User data. (DWORD)CALLBACK_FUNCTION); if (errCode != MMSYSERR_NOERROR) { printf(" -> OSME::sound callback-errCode : %d\n", errCode); return FALSE; } // Alloc the sample buffers. for (int i=0;i<REPLAY_NBSOUNDBUFFER;i++) { m_pSoundBuffer[i] = malloc(m_bufferSize); memset(&m_waveHeader[i],0,sizeof(WAVEHDR)); memset(m_pSoundBuffer[i],0,m_bufferSize); } // Fill all the sound buffers m_currentBuffer = 0; for (int i=0;i<REPLAY_NBSOUNDBUFFER;i++) { fillNextBuffer(); } return TRUE; }