RageSound_Generic_Software::RageSound_Generic_Software(): m_Mutex("RageSound_Generic_Software"), m_SoundListMutex("SoundListMutex") { shutdown_decode_thread = false; SetDecodeBufferSize( 4096 ); m_DecodeThread.SetName("Decode thread"); }
RageSoundDriver::RageSoundDriver(): m_Mutex("RageSoundDriver"), m_SoundListMutex("SoundListMutex") { m_bShutdownDecodeThread = false; m_iMaxHardwareFrame = 0; SetDecodeBufferSize( 4096 ); m_DecodeThread.SetName("Decode thread"); }
RString RageSoundDriver_WaveOut::Init() { m_iSampleRate = PREFSMAN->m_iSoundPreferredSampleRate; if( m_iSampleRate == 0 ) m_iSampleRate = 44100; WAVEFORMATEX fmt; fmt.wFormatTag = WAVE_FORMAT_PCM; fmt.nChannels = channels; fmt.cbSize = 0; fmt.nSamplesPerSec = m_iSampleRate; fmt.wBitsPerSample = 16; fmt.nBlockAlign = fmt.nChannels * fmt.wBitsPerSample / 8; fmt.nAvgBytesPerSec = fmt.nSamplesPerSec * fmt.nBlockAlign; MMRESULT ret = waveOutOpen( &m_hWaveOut, WAVE_MAPPER, &fmt, (DWORD_PTR) m_hSoundEvent, NULL, CALLBACK_EVENT ); if( ret != MMSYSERR_NOERROR ) return wo_ssprintf( ret, "waveOutOpen failed" ); ZERO( m_aBuffers ); for(int b = 0; b < num_chunks; ++b) { m_aBuffers[b].dwBufferLength = chunksize; m_aBuffers[b].lpData = new char[chunksize]; ret = waveOutPrepareHeader( m_hWaveOut, &m_aBuffers[b], sizeof(m_aBuffers[b]) ); if( ret != MMSYSERR_NOERROR ) return wo_ssprintf( ret, "waveOutPrepareHeader failed" ); m_aBuffers[b].dwFlags |= WHDR_DONE; } LOG->Info( "WaveOut software mixing at %i hz", m_iSampleRate ); /* We have a very large writeahead; make sure we have a large enough decode * buffer to recover cleanly from underruns. */ SetDecodeBufferSize( buffersize_frames * 3/2 ); StartDecodeThread(); MixingThread.SetName( "Mixer thread" ); MixingThread.Create( MixerThread_start, this ); return RString(); }