Exemplo n.º 1
0
jint Java_de_illogical_modo_SpcDecoder_spcLoadFromZip(JNIEnv* env, jclass clazz, jstring zipfile, jstring entry)
{
	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;

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

	if (emu != NULL)
		return size;

	return 0;
}
Exemplo n.º 2
0
jint Java_de_illogical_modo_GmeDecoder_gmeLoadM3uFromZip(JNIEnv* env, jclass clazz, jstring zipfile, jstring entry)
{
    char* m3udata;
    int size;
    char czipfile[1024];
    char centry[1024];

    if (emu == NULL)
        return 0;

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

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

    if (m3udata == NULL)
        return 0;

    //__android_log_print(ANDROID_LOG_VERBOSE, "gme", "LoadM3uZip: %d %s ", size, centry);

    gme_err_t err = gme_load_m3u_data(emu, m3udata, size);
    free(m3udata);

    //__android_log_print(ANDROID_LOG_VERBOSE, "gme", "LoadM3uZip: %s", err == NULL ? "null" : err);

    return err == NULL;
}
Exemplo n.º 3
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;
}