Beispiel #1
0
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;
    }
}
Beispiel #3
0
bool GME::open(const QString &_url, bool tracksOnly)
{
	QString prefix, url, param;
	const bool hasPluginPrefix = Functions::splitPrefixAndUrlIfHasPluginPrefix(_url, &prefix, &url, &param);

	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;
}