bool MidiPlayerThread::start( const QString &path, int volume, double seek /* = -1 */ ) { qDebug() << "MidiPlayerThread::start"; unsigned short int mixer_options = 0; m_path = path; if ( open_alsa_output() == ( -1 ) ) { qDebug() << "MidiPlayerThread::start: error of open_alsa_output()..."; return false; } if ( WildMidi_Init( qPrintable( m_configFile ), m_sample_rate, mixer_options ) < 0 ) { qWarning( "MidiPlayerThread::start: unable to initialize WildMidi library" ); close_output(); return false; } m_midiPtr = WildMidi_Open ( qPrintable( m_path ) ); if ( !m_midiPtr ) { qWarning("MidiPlayerThread::start: unable to open file"); WildMidi_Shutdown(); close_output(); return false; } Tracks audios; audios.addID( 0 ); _WM_Info *wm_info = WildMidi_GetInfo( m_midiPtr ); m_totalTime = ( qint64 )wm_info->approx_total_samples / m_sample_rate; qDebug() << "total time is " << m_totalTime << " sec"; m_md->reset(); m_md->duration = m_totalTime; m_md->audio_rate = m_sample_rate; m_md->novideo = true; m_md->audios = audios; // m_md->type = TYPE_FILE; setVolume( volume ); if ( seek != ( -1 ) ) { goToSec( seek ); } QThread::start(); qDebug( "MidiPlayerThread: thread started" ); emit audioInfoChanged( audios ); return true; }
void free() { if (s_initialized) { stop(); if (s_midiFormat == MFMT_GUS_PATCH) { WildMidi_Shutdown(); } else if (s_midiFormat == MFMT_SOUND_FONT) { delete_fluid_settings(s_fluidSettings); delete_fluid_synth(s_fluidSynth); delete_fluid_sequencer(s_fluidSeq); delete_fluid_player(s_fluidPlayer); unloadFluidsynthDLL(); } s_initialized = false; delete s_mutex; } }
void MidiPlayerThread::play() { qDebug() << "MidiPlayerThread::play"; const unsigned long int buf_size = 4096; int output_result = 0; unsigned long int count_diff; unsigned long int cur_sec, prev_sec; m_inPause = false; m_received_end_of_file = false; cur_sec = 0; QByteArray buf; buf.resize( buf_size ); _WM_Info *wm_info = WildMidi_GetInfo( m_midiPtr ); m_md->list(); emit receivedStartingTime( 0 ); emit backendFullyLoaded(); emit receivedNoVideo(); qDebug() << "approx_total_samples is " << wm_info->approx_total_samples; while ( 1 ) { if ( m_isStop ) { qDebug() << "MidiPlayerThread::play: m_isStop = " << m_isStop; break; } count_diff = wm_info->approx_total_samples - wm_info->current_sample; if ( count_diff == 0 ) { qDebug() << "MidiPlayerThread::play: it is count_diff == 0"; break; } if ( m_inPause ) { usleep( 1000 ); continue; } buf.fill( 0 ); if ( count_diff < buf_size ) { buf.resize( count_diff * 4 ); output_result = WildMidi_GetOutput ( m_midiPtr, buf.data(), ( count_diff * 4 ) ); } else { output_result = WildMidi_GetOutput ( m_midiPtr, buf.data(), buf_size ); } if ( output_result <= 0 ) { qDebug() << "MidiPlayerThread::play: output_result <= 0"; break; } prev_sec = wm_info->current_sample / m_sample_rate; if ( prev_sec != cur_sec ) { cur_sec = prev_sec; emit receivedCurrentSec( cur_sec ); // qDebug() << "cur_sec is " << cur_sec; } send_output( buf.data(), output_result ); wm_info = WildMidi_GetInfo( m_midiPtr ); } // buf.fill( 0, 16384 ); // send_output( buf.data(), 16384); // buf.fill( 0, 16384 ); // send_output( buf.data(), 16384); // send_output( buf.data(), 16384); // usleep( 5000 ); if ( m_midiPtr ) { // file was played if ( WildMidi_Close( m_midiPtr ) == ( -1 ) ) { qDebug() << "oops!"; } m_midiPtr = 0; } WildMidi_Shutdown(); close_output(); // emit processExited(); m_received_end_of_file = true; qDebug() << "MidiPlayerThread::play: end of play"; }
static void wildmidi_finish(void) { WildMidi_Shutdown(); }