static int cgme_numvoices (void) { if (!emu) { return 0; } return gme_voice_count (emu); }
int crPlayerSetTrack(void *context, int track) { gmeContext *gme = (gmeContext*)context; gme_err_t status = NULL; int trueTrack; fileEntry *entry; /* initialize the engine */ if (gme->isGameMusicArchive) { /* when it's time to start a track, it's always going to be * track 0 (first and only) of a single-song file */ trueTrack = 0; /* if a file is already being played, free it first */ if (gme->emu) { gme_delete(gme->emu); gme->emu = NULL; } entry = &gme->entries[track]; status = gme_open_data(gme->dataBuffer + entry->offset, entry->size, &gme->emu, gme->sampleRate); if (status) return 0; } else { trueTrack = track; /* if the player isn't already open, do the initialization */ if (!gme->emu) { status = gme_open_data(gme->dataBuffer, gme->dataBufferSize, &gme->emu, gme->sampleRate); if (status) return 0; } } /* set the track */ status = gme_start_track(gme->emu, trueTrack); if (!status) { gme_type_t type = gme_type(gme->emu); gme->voiceCount = gme_voice_count(gme->emu); /* return either mono or stereo depending on the file type */ if ((type == gme_gbs_type) || (type == gme_spc_type) || (type == gme_vgm_type)) return 2; /* stereo */ else return 1; /* mono */ } else { gme_delete(gme->emu); gme->emu = NULL; return 0; } }
bool GME::open(const QString &_url, bool tracksOnly) { QString prefix, url, param; const bool hasPluginPrefix = Functions::splitPrefixAndUrlIfHasPluginPrefix(_url, &prefix, &url, ¶m); if (tracksOnly == hasPluginPrefix) return false; int track = 0; if (!hasPluginPrefix) { if (url.startsWith(GMEName "://")) return false; url = _url; } else { if (prefix != GMEName) return false; bool ok; track = param.toInt(&ok); if (track < 0 || !ok) return false; } if (Reader::create(url, m_reader)) { const QByteArray data = m_reader->read(m_reader->size()); m_reader.clear(); gme_open_data(data.data(), data.size(), &m_gme, m_srate); if (!m_gme) return false; if (!hasPluginPrefix) { m_aborted = true; m_url = url; return true; } if (track >= gme_track_count(m_gme)) return false; gme_info_t *info = NULL; if (!gme_track_info(m_gme, &info, track) && info) { m_title = getTitle(info, track); m_length = getLength(info); if (*info->game) m_tags << qMakePair(QString::number(QMPLAY2_TAG_TITLE), QString(info->game)); if (*info->author) m_tags << qMakePair(QString::number(QMPLAY2_TAG_ARTIST), QString(info->author)); if (*info->system) m_tags << qMakePair(tr("System"), QString(info->system)); if (*info->copyright) m_tags << qMakePair(tr("Copyright"), QString(info->copyright)); if (*info->comment) m_tags << qMakePair(tr("Comment"), QString(info->comment)); gme_free_info(info); } QString voices; const int numVoices = gme_voice_count(m_gme); for (int i = 0; i < numVoices; ++i) { voices += gme_voice_name(m_gme, i); voices += ", "; } voices.chop(2); m_tags << qMakePair(tr("Voices"), voices); m_tags << qMakePair(tr("Track"), QString::number(track + 1)); streams_info += new StreamInfo(m_srate, 2); gme_set_stereo_depth(m_gme, 0.5); return !gme_start_track(m_gme, track); } return false; }