Пример #1
0
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;
}
Пример #2
0
	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;
		}
	}
Пример #3
0
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();
}