示例#1
0
void Java_de_illogical_modo_GmeDecoder_gmeSetStereoSeparation(JNIEnv* env, jclass clazz, jint d)
{
    depth = d/100.0;
    if (depth < 0.0)
        depth = 0.0;
    if (depth > 1.0)
        depth = 1.0;
    if (emu != NULL)
        gme_set_stereo_depth(emu, depth);
}
示例#2
0
jint Java_de_illogical_modo_GmeDecoder_gmeSetTrack(JNIEnv* env, jclass clazz, jint track)
{
    if (emu == NULL)
    {
        return -1;
    }

    gme_ignore_silence(emu, 1);
    gme_start_track(emu, track);
    gme_set_stereo_depth(emu, depth);
    return 1;
}
示例#3
0
jint Java_de_illogical_modo_GmeDecoder_gmeLoadFile(JNIEnv* env, jclass clazz, jstring path)
{
    char cpath[1024];
    memset(cpath, 0, 1024);

    int clen = (*env)->GetStringLength(env, path);
    if (clen > 1023)
        return 0;
    (*env)->GetStringUTFRegion(env, path, 0, clen, cpath);

    gme_err_t err = gme_open_file(cpath, &emu, 44100);

    if (err != NULL)
    {
        emu = NULL;
    }
    else
    {
        gme_start_track(emu, 0);
        gme_set_stereo_depth(emu, depth);
    }

    return emu != NULL;
}
示例#4
0
static gboolean
xmms_gme_init (xmms_xform_t *xform)
{
	xmms_gme_data_t *data;
	gme_err_t init_error;
	GString *file_contents; /* The raw data from the file. */
	gme_info_t *metadata = NULL;
	xmms_config_property_t *val;
	int loops;
	int maxlength;
	const char *subtune_str;
	int subtune = 0;
	long fadelen = -1;
	int samplerate;
	double stereodepth;


	g_return_val_if_fail (xform, FALSE);

	data = g_new0 (xmms_gme_data_t, 1);

	xmms_xform_private_data_set (xform, data);

	val = xmms_xform_config_lookup (xform, "samplerate");
	samplerate = xmms_config_property_get_int (val);
	if (samplerate < 1)
		samplerate = GME_DEFAULT_SAMPLE_RATE;
	data->samplerate = samplerate;

	xmms_xform_outdata_type_add (xform,
	                             XMMS_STREAM_TYPE_MIMETYPE,
	                             "audio/pcm", /* PCM samples */
	                             XMMS_STREAM_TYPE_FMT_FORMAT,
	                             XMMS_SAMPLE_FORMAT_S16, /* 16-bit signed */
	                             XMMS_STREAM_TYPE_FMT_CHANNELS,
	                             2, /* stereo */
	                             XMMS_STREAM_TYPE_FMT_SAMPLERATE,
	                             samplerate,
	                             XMMS_STREAM_TYPE_END);

	file_contents = g_string_new ("");

	for (;;) {
		xmms_error_t error;
		gchar buf[4096];
		gint ret;

		ret = xmms_xform_read (xform, buf, sizeof (buf), &error);
		if (ret == -1) {
			XMMS_DBG ("Error reading emulated music data");
			return FALSE;
		}
		if (ret == 0) {
			break;
		}
		g_string_append_len (file_contents, buf, ret);
	}

	init_error = gme_open_data (file_contents->str, file_contents->len, &data->emu, samplerate);

	g_string_free (file_contents, TRUE);

	if (init_error) {
		XMMS_DBG ("gme_open_data returned an error: %s", init_error);
		return FALSE;
	}

	if (xmms_xform_metadata_get_str (xform, "subtune", &subtune_str)) {
		subtune = strtol (subtune_str, NULL, 10);
		XMMS_DBG ("Setting subtune to %d", subtune);
		if ((subtune < 0 || subtune > gme_track_count (data->emu))) {
			XMMS_DBG ("Invalid subtune index");
			return FALSE;
		}
	} else {
		xmms_xform_metadata_set_int (xform, XMMS_MEDIALIB_ENTRY_PROPERTY_SUBTUNES, gme_track_count (data->emu));
	}

	/*
	 *  Get metadata here
	 */
	init_error = gme_track_info (data->emu, &metadata, subtune);
	if (init_error) {
		XMMS_DBG ("Couldn't get GME track info: %s", init_error);
		init_error = "";
	} else {
		xmms_xform_metadata_set_str (xform, XMMS_MEDIALIB_ENTRY_PROPERTY_TITLE, metadata->song);
		xmms_xform_metadata_set_str (xform, XMMS_MEDIALIB_ENTRY_PROPERTY_ARTIST, metadata->author);
		xmms_xform_metadata_set_str (xform, XMMS_MEDIALIB_ENTRY_PROPERTY_ALBUM, metadata->game);
		xmms_xform_metadata_set_str (xform, XMMS_MEDIALIB_ENTRY_PROPERTY_COMMENT, metadata->comment);
		xmms_xform_metadata_set_str (xform, XMMS_MEDIALIB_ENTRY_PROPERTY_YEAR, metadata->copyright);
		xmms_xform_metadata_set_str (xform, XMMS_MEDIALIB_ENTRY_PROPERTY_GENRE, metadata->system);  /* I mapped genre to the system type */

		val = xmms_xform_config_lookup (xform, "loops");
		loops = xmms_config_property_get_int (val);

		XMMS_DBG ("intro_length = %d, loops = %d, loop_length = %d", metadata->intro_length, loops, metadata->loop_length);

		if (metadata->intro_length > 0) {
			if ((loops > 0) && (metadata->loop_length > 0)) {
				fadelen = metadata->intro_length + loops * metadata->loop_length;
				XMMS_DBG ("fadelen now = %ld", fadelen);
			} else {
				fadelen = metadata->length;
				XMMS_DBG ("fadelen now = %ld", fadelen);
			}
		}
	}

	val = xmms_xform_config_lookup (xform, "maxlength");
	maxlength = xmms_config_property_get_int (val);

	XMMS_DBG ("maxlength = %d seconds", maxlength);

	if (maxlength > 0 && (fadelen < 0 || (maxlength * 1000L < fadelen))) {
		fadelen = maxlength * 1000L;
		XMMS_DBG ("fadelen now = %ld", fadelen);
	}

	XMMS_DBG ("gme.fadelen = %ld", fadelen);

	val = xmms_xform_config_lookup (xform, "stereodepth");
	stereodepth = xmms_config_property_get_float (val);
	if (stereodepth >= 0.0 && stereodepth <= 1.0) {
		XMMS_DBG ("Setting stereo depth to %f.", stereodepth);
		gme_set_stereo_depth (data->emu, stereodepth);
	} else {
		XMMS_DBG ("gme.stereodepth = %f out of range 0.0 - 1.0; not setting.", stereodepth);
	}

	init_error = gme_start_track (data->emu, subtune);
	if (init_error) {
		XMMS_DBG ("gme_start_track returned an error: %s", init_error);
		gme_free_info (metadata);
		return FALSE;
	}

	if (fadelen > 0) {
		XMMS_DBG ("Setting song length and fade length...");
		xmms_xform_metadata_set_int (xform, XMMS_MEDIALIB_ENTRY_PROPERTY_DURATION, fadelen);
		gme_set_fade (data->emu, fadelen);
	}

	gme_free_info (metadata);
	return TRUE;
}
示例#5
0
void Music_Player::set_stereo_depth( double tempo )
{
	suspend();
	gme_set_stereo_depth( emu_, tempo );
	resume();
}
示例#6
0
文件: glue.cpp 项目: Chaduke/bah.mod
void bmx_gme_set_stereo_depth(MaxMusicEmu * emu, double depth) {
	gme_set_stereo_depth(emu->emu, depth);
}
示例#7
0
文件: GME.cpp 项目: biddyweb/QMPlay2
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;
}
示例#8
0
jint Java_de_illogical_modo_GmeDecoder_gmeLoadFromZip(JNIEnv* env, jclass clazz, jstring zipfile, jstring entry, int vgzfile)
{
    char* data = NULL;
    int size = 0;
    char czipfile[1024];
    char centry[1024];

    memset(czipfile, 0, 1024);
    int clen = (*env)->GetStringLength(env, zipfile);
    if (clen > 1023)
        return 0;
    (*env)->GetStringUTFRegion(env, zipfile, 0, clen, czipfile);

    memset(centry, 0, 1024);
    clen = (*env)->GetStringLength(env, entry);
    if (clen > 1023)
        return 0;
    (*env)->GetStringUTFRegion(env, entry, 0, clen, centry);

    data = getUncompressedData(czipfile, centry, &size);

    if (data == NULL)
        return 0;

    // If its a .vgz file inflate it. Problem is, can go up to 10MB. GME copies data = 20MB.
    // kss can also be gzip
    if (size > 10 && data[0] == 0x1F && data[1] == 0x8B) {
        unsigned long uncompressed_size = data[size-1] << 24 | data[size-2] << 16 | data[size-3] << 8 | data[size-4];
        char* inflatebuffer = malloc(uncompressed_size);
        if (inflatebuffer != NULL) {
            int err;
            z_stream zs;
            zs.zalloc = Z_NULL;
            zs.zfree = Z_NULL;
            zs.opaque = Z_NULL;
            zs.next_in = data;
            zs.avail_in = size;
            zs.next_out = inflatebuffer;
            zs.avail_out = uncompressed_size;

            inflateInit2(&zs, 16 + MAX_WBITS);
            err = inflate(&zs, Z_FINISH);
            if (err == Z_STREAM_END) {
                //__android_log_print(ANDROID_LOG_VERBOSE, "gme", "-> ZLIB STREAM END - extracted Bytes %ld", zs.total_out);
                size = zs.total_out;
                free(data);
                data = inflatebuffer;
            } else {
                free(inflatebuffer);
            }
            inflateEnd(&zs);
        }
    }

    // GME copies memory
    gme_err_t err = gme_open_data(data, size, &emu, 44100);
    free(data);

    if (err != NULL)
    {
        emu = NULL;
    }
    else
    {
        gme_start_track(emu, 0);
        gme_set_stereo_depth(emu, depth);
    }

    if (emu != NULL)
        return size;

    return 0;
}