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; }
bool loadMidiFile(const char* file) { LOCK(); if (s_midiFormat == MFMT_GUS_PATCH) { s_song = WildMidi_Open(file); } else if (s_midiFormat == MFMT_SOUND_FONT) { s_song = (void*)(fluid_player_add(s_fluidPlayer, file) >= 0 ? 1 : 0); s_fluidPlaying = false; } UNLOCK(); return (s_song!=NULL); }
QList<FileInfo *> DecoderWildMidiFactory::createPlayList(const QString &fileName, bool useMetaData, QStringList *) { Q_UNUSED(useMetaData); QList <FileInfo*> list; FileInfo *info = new FileInfo(fileName); if(WildMidiHelper::instance()->initialize() && WildMidiHelper::instance()->sampleRate()) { void *midi_ptr = WildMidi_Open (fileName.toLocal8Bit()); if(midi_ptr) { WildMidiHelper::instance()->addPtr(midi_ptr); _WM_Info *wm_info = WildMidi_GetInfo(midi_ptr); info->setLength((qint64)wm_info->approx_total_samples / WildMidiHelper::instance()->sampleRate()); WildMidi_Close(midi_ptr); WildMidiHelper::instance()->removePtr(midi_ptr); } } list << info; return list; }
static void wildmidi_file_decode(struct decoder *decoder, const char *path_fs) { static const struct audio_format audio_format = { .sample_rate = WILDMIDI_SAMPLE_RATE, .format = SAMPLE_FORMAT_S16, .channels = 2, }; midi *wm; const struct _WM_Info *info; enum decoder_command cmd; wm = WildMidi_Open(path_fs); if (wm == NULL) return; info = WildMidi_GetInfo(wm); if (info == NULL) { WildMidi_Close(wm); return; } decoder_initialized(decoder, &audio_format, true, info->approx_total_samples / WILDMIDI_SAMPLE_RATE); do { char buffer[4096]; int len; info = WildMidi_GetInfo(wm); if (info == NULL) break; len = WildMidi_GetOutput(wm, buffer, sizeof(buffer)); if (len <= 0) break; cmd = decoder_data(decoder, NULL, buffer, len, 0); if (cmd == DECODE_COMMAND_SEEK) { unsigned long seek_where = WILDMIDI_SAMPLE_RATE * decoder_seek_where(decoder); WildMidi_SampledSeek(wm, &seek_where); decoder_command_finished(decoder); cmd = DECODE_COMMAND_NONE; } } while (cmd == DECODE_COMMAND_NONE); WildMidi_Close(wm); } static struct tag * wildmidi_tag_dup(const char *path_fs) { midi *wm; const struct _WM_Info *info; struct tag *tag; wm = WildMidi_Open(path_fs); if (wm == NULL) return NULL; info = WildMidi_GetInfo(wm); if (info == NULL) { WildMidi_Close(wm); return NULL; } tag = tag_new(); tag->time = info->approx_total_samples / WILDMIDI_SAMPLE_RATE; WildMidi_Close(wm); return tag; }