view Plugins/Input/console/Audacious_Driver.cpp @ 95:8247bbf454a8 trunk

[svn] Add code for decoder thread.
author nenolod
date Tue, 01 Nov 2005 21:09:52 -0800
parents 2801eda0683f
children 8dbd2d31c1f7
line wrap: on
line source

/*
 * Audacious: Cross platform multimedia player
 * Copyright (c) 2005  Audacious Team
 *
 * Driver for Game_Music_Emu library. See details at:
 * http://www.slack.net/~ant/libs/
 */

#include "Audacious_Driver.h"

#include "libaudacious/configfile.h"
#include "libaudacious/util.h"
#include "libaudacious/titlestring.h"
#include "audacious/output.h"
#include <gtk/gtk.h>

#include <cstring>

static Spc_Emu *spc = NULL;
static GThread *decode_thread;
static InputPlugin console_ip;

static void *play_loop(gpointer arg);

static int is_our_file(gchar *filename)
{
	gchar *ext;

	ext = strrchr(filename, '.');

	if (ext)
	{
		if (!strcasecmp(ext, ".spc"))
			return 1;
	}

	return 0;
}

static gchar *get_title(gchar *filename)
{
	gchar *title;
	Emu_Std_Reader reader;
	Spc_Emu::header_t header;

	reader.open(filename);
	reader.read(&header, sizeof(header));

	title = g_strdup(header.song);

	return title;
}

static void get_song_info(char *filename, char **title, int *length)
{
	(*title) = get_title(filename);
	(*length) = -1;
}

static void play_file(char *filename)
{
	Emu_Std_Reader reader;
	Spc_Emu::header_t header;

	reader.open(filename);
	reader.read(&header, sizeof(header));

	spc = new Spc_Emu;
	spc->init(44100);
	spc->load(header, reader);
	spc->start_track(0);

	decode_thread = g_thread_create(play_loop, NULL, FALSE, NULL);
}

static void *play_loop(gpointer arg)
{
	Music_Emu::sample_t buf[1024];

	while (spc->play(1024, buf))
	{
		produce_audio(console_ip.output->written_time(),
				FMT_S16_LE, 2, 1024, (char *) buf,
				NULL);
		xmms_usleep(100000);
	}

	delete spc;
	g_thread_exit(NULL);

	return NULL;
}