@ -142,34 +142,47 @@ ma_context* SoundManager::context() {
void SoundManager : : playRawPcm ( const int16_t * pcm , int sampleCount , int sampleRate , int channels ) {
if ( ! m_engine | | ! m_initialized ) {
qWarning ( " SoundManager::playRawPcm: not initialized (engine=%p init=%d) " , ( void * ) m_engine , m_initialized ) ;
DEBUG_WARN ( DEBUG_CATEGORY_DEBUG , " SoundManager::playRawPcm: not initialized " ) ;
return ;
}
qDebug ( " SoundManager::playRawPcm: %d samples %dHz %dch vol=%.2f " , sampleCount , sampleRate , channels , m_volume ) ;
stopCurrentPcm ( ) ;
DEBUG_DEBUG ( DEBUG_CATEGORY_DEBUG , " SoundManager::playRawPcm: %d samples %dHz %dch " , sampleCount , sampleRate , channels ) ;
ma_audio_buffer_config bufCfg = ma_audio_buffer_config_init (
ma_format_s16 , ( ma_uint32 ) channels , ( ma_uint64 ) sampleCount , pcm , NULL ) ;
ma_audio_buffer * buf = new ma_audio_buffer ;
m_currentPcmBuffer = buf ;
ma_result r = ma_audio_buffer_init_copy ( & bufCfg , buf ) ;
if ( r ! = MA_SUCCESS ) {
qWarning ( " SoundManager: audio_buffer_init_copy failed (%d) " , r ) ;
delete buf ;
DEBUG_WARN ( DEBUG_CATEGORY_DEBUG , " SoundManager: audio_buffer_init_copy failed (%d) " , r ) ;
delete buf ; m_currentPcmBuffer = nullptr ;
return ;
}
ma_sound * s ound = new ma_sound ;
r = ma_sound_init_from_data_source ( m_engine , ( ma_data_source * ) buf , 0 , nullptr , s ound) ;
m_currentPcmS ound = new ma_sound ;
r = ma_sound_init_from_data_source ( m_engine , ( ma_data_source * ) buf , 0 , nullptr , m_currentPcmS ound) ;
if ( r ! = MA_SUCCESS ) {
qWarning ( " SoundManager: PCM sound init failed (%d) " , r ) ;
ma_audio_buffer_uninit ( buf ) ;
delete buf ;
delete sound ;
DEBUG_WARN ( DEBUG_CATEGORY_DEBUG , " SoundManager: PCM sound init failed (%d) " , r ) ;
ma_audio_buffer_uninit ( buf ) ; delete buf ; m_currentPcmBuffer = nullptr ;
delete m_currentPcmSound ; m_currentPcmSound = nullptr ;
return ;
}
ma_sound_set_volume ( sound , m_volume ) ;
ma_sound_start ( sound ) ;
qDebug ( " SoundManager::playRawPcm: started " ) ;
ma_sound_set_volume ( m_currentPcmSound , m_volume ) ;
ma_sound_start ( m_currentPcmSound ) ;
}
void SoundManager : : stopCurrentPcm ( ) {
if ( m_currentPcmSound ) {
ma_sound_stop ( m_currentPcmSound ) ;
delete m_currentPcmSound ; m_currentPcmSound = nullptr ;
}
if ( m_currentPcmBuffer ) {
ma_audio_buffer * buf = ( ma_audio_buffer * ) m_currentPcmBuffer ;
ma_audio_buffer_uninit ( buf ) ;
delete buf ;
m_currentPcmBuffer = nullptr ;
}
}
static QString decodeDeviceName ( const char * name ) {