annotate src/console/Audacious_Driver.cxx @ 648:0eca44731221 trunk

[svn] - fix timing on fades
author nenolod
date Wed, 14 Feb 2007 01:43:35 -0800
parents 73ae7a6d510e
children 3c1e835ebd68
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
1 /*
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
2 * Audacious: Cross platform multimedia player
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
3 * Copyright (c) 2005-2006 Audacious Team
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
4 *
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
5 * Driver for Game_Music_Emu library. See details at:
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
6 * http://www.slack.net/~ant/libs/
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
7 */
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
8
528
4d8b92b55acf [svn] - add config.h includes where needed
nenolod
parents: 527
diff changeset
9 #ifdef HAVE_CONFIG_H
4d8b92b55acf [svn] - add config.h includes where needed
nenolod
parents: 527
diff changeset
10 # include "config.h"
4d8b92b55acf [svn] - add config.h includes where needed
nenolod
parents: 527
diff changeset
11 #endif
4d8b92b55acf [svn] - add config.h includes where needed
nenolod
parents: 527
diff changeset
12
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
13 #include <glib.h>
527
d124034ebea3 [svn] - glib/gi18n.h -> audacious/i18n.h for automatic dgettext support
nenolod
parents: 385
diff changeset
14 #include <audacious/i18n.h>
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
15 #include <gtk/gtk.h>
3
088092a52fea [svn] - move from (internal) libaudacious/ include path to audacious/ include path
nenolod
parents: 0
diff changeset
16 #include "audacious/util.h"
088092a52fea [svn] - move from (internal) libaudacious/ include path to audacious/ include path
nenolod
parents: 0
diff changeset
17 #include "audacious/titlestring.h"
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
18 extern "C" {
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
19 #include "audacious/output.h"
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
20 #include "audacious/playlist.h"
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
21 }
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
22 #include <string.h>
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
23 #include <stdlib.h>
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
24 #include <math.h>
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
25
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
26 // configdb and prefs ui
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
27 #include "Audacious_Config.h"
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
28
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
29 #include "Music_Emu.h"
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
30 #include "Gzip_Reader.h"
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
31
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
32 int const fade_threshold = 10 * 1000;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
33 int const fade_length = 8 * 1000;
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
34 int const path_max = 4096;
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
35
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
36 AudaciousConsoleConfig audcfg = { 180, FALSE, 32000, TRUE, 0, 0, FALSE, 0 };
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
37 static GThread* decode_thread;
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
38 static GStaticMutex playback_mutex = G_STATIC_MUTEX_INIT;
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
39 static int console_ip_is_going;
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
40 static volatile long pending_seek;
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
41 extern InputPlugin console_ip;
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
42 static Music_Emu* emu = 0;
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
43
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
44 static blargg_err_t log_err( blargg_err_t err )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
45 {
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
46 if ( err )
380
1397798646fb [svn] - change use of printf to g_warning() and g_critical() where appropriate.
nenolod
parents: 378
diff changeset
47 g_critical( "console error: %s\n", err );
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
48 return err;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
49 }
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
50
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
51 static void log_warning( Music_Emu* emu )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
52 {
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
53 const char* w = emu->warning();
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
54 if ( w )
380
1397798646fb [svn] - change use of printf to g_warning() and g_critical() where appropriate.
nenolod
parents: 378
diff changeset
55 g_warning( "console warning: %s\n", w );
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
56 }
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
57
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
58 static void unload_file()
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
59 {
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
60 if ( emu )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
61 log_warning( emu );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
62 gme_delete( emu );
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
63 emu = NULL;
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
64 }
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
65
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
66 // Handles URL parsing, file opening and identification, and file loading.
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
67 // Keeps file header around when loading rest of file to avoid seeking
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
68 // and re-reading.
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
69 class File_Handler {
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
70 public:
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
71 gchar* path; // path without track number specification
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
72 int track; // track number (0 = first track)
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
73 bool track_specified; // false if no track number was specified in path
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
74 Music_Emu* emu; // set to 0 to take ownership
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
75 gme_type_t type;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
76
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
77 // Parses path and identifies file type
385
ac806e416c48 [svn] - some improvements for chiptune expansion efficiency
nenolod
parents: 382
diff changeset
78 File_Handler( const char* path, VFSFile* fd = 0, gboolean is_our_file_hack = FALSE );
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
79
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
80 // Creates emulator and returns 0. If this wasn't a music file or
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
81 // emulator couldn't be created, returns 1.
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
82 int load( long sample_rate );
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
83
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
84 // Deletes owned emu and closes file
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
85 ~File_Handler();
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
86 private:
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
87 char header [4];
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
88 Vfs_File_Reader vfs_in;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
89 Gzip_Reader in;
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
90 };
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
91
385
ac806e416c48 [svn] - some improvements for chiptune expansion efficiency
nenolod
parents: 382
diff changeset
92 File_Handler::File_Handler( const char* path_in, VFSFile* fd, gboolean is_our_file_hack )
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
93 {
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
94 emu = 0;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
95 type = 0;
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
96 track = 0;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
97 track_specified = false;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
98
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
99 path = g_strdup( path_in );
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
100 if ( !path )
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
101 return; // out of memory
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
102
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
103 // extract track number
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
104 gchar* args = strchr( path, '?' ); // TODO: use strrchr()?
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
105 if ( args )
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
106 {
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
107 *args = '\0';
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
108 // TODO: use func with better error reporting, and perhaps don't
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
109 // truncate path if there is no number after ?
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
110 track = atoi( args + 1 );
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
111 track_specified = true;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
112 }
381
53056ce7940d [svn] - avoid opening VFS FDs for track URIs where we know that the file is valid
nenolod
parents: 380
diff changeset
113
53056ce7940d [svn] - avoid opening VFS FDs for track URIs where we know that the file is valid
nenolod
parents: 380
diff changeset
114 // if the track is specified, then we have a match. don't worry
53056ce7940d [svn] - avoid opening VFS FDs for track URIs where we know that the file is valid
nenolod
parents: 380
diff changeset
115 // about it right now -nenolod
385
ac806e416c48 [svn] - some improvements for chiptune expansion efficiency
nenolod
parents: 382
diff changeset
116 if (track_specified && is_our_file_hack)
381
53056ce7940d [svn] - avoid opening VFS FDs for track URIs where we know that the file is valid
nenolod
parents: 380
diff changeset
117 return;
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
118
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
119 // open vfs
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
120 if ( fd )
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
121 vfs_in.reset( fd );
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
122 else if ( log_err( vfs_in.open( path ) ) )
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
123 return;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
124
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
125 // now open gzip_reader on top of vfs
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
126 if ( log_err( in.open( &vfs_in ) ) )
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
127 return;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
128
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
129 // read and identify header
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
130 if ( !log_err( in.read( header, sizeof header ) ) )
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
131 {
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
132 type = gme_identify_extension( gme_identify_header( header ) );
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
133 if ( !type )
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
134 {
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
135 type = gme_identify_extension( path );
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
136 if ( type != gme_gym_type ) // only trust file extension for headerless .gym files
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
137 type = 0;
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
138 }
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
139 }
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
140 }
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
141
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
142 File_Handler::~File_Handler()
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
143 {
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
144 gme_delete( emu );
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
145 g_free( path );
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
146 }
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
147
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
148 int File_Handler::load( long sample_rate )
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
149 {
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
150 if ( !type )
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
151 return 1;
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
152
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
153 emu = gme_new_emu( type, sample_rate );
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
154 if ( !emu )
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
155 {
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
156 log_err( "Out of memory" );
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
157 return 1;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
158 }
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
159
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
160 {
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
161 // combine header with remaining file data
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
162 Remaining_Reader reader( header, sizeof header, &in );
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
163 if ( log_err( emu->load( reader ) ) )
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
164 return 1;
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
165 }
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
166
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
167 // files can be closed now
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
168 in.close();
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
169 vfs_in.close();
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
170
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
171 log_warning( emu );
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
172
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
173 // load .m3u from same directory( replace/add extension with ".m3u")
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
174 char m3u_path [path_max + 5];
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
175 strncpy( m3u_path, path, path_max );
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
176 m3u_path [path_max] = 0;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
177 // TODO: use better path-building functions
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
178 char* p = strrchr( m3u_path, '.' );
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
179 if ( !p )
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
180 p = m3u_path + strlen( m3u_path );
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
181 strcpy( p, ".m3u" );
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
182
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
183 Vfs_File_Reader m3u;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
184 if ( !m3u.open( m3u_path ) )
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
185 {
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
186 if ( log_err( emu->load_m3u( m3u ) ) ) // TODO: fail if m3u can't be loaded?
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
187 log_warning( emu ); // this will log line number of first problem in m3u
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
188 }
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
189
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
190 return 0;
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
191 }
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
192
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
193 // Get info
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
194
603
73ae7a6d510e [svn] - don't fill in tuple fields with "".
nenolod
parents: 582
diff changeset
195 static inline gchar *selective_strdup(const gchar *in)
73ae7a6d510e [svn] - don't fill in tuple fields with "".
nenolod
parents: 582
diff changeset
196 {
73ae7a6d510e [svn] - don't fill in tuple fields with "".
nenolod
parents: 582
diff changeset
197 if (in == NULL || *in == '\0')
73ae7a6d510e [svn] - don't fill in tuple fields with "".
nenolod
parents: 582
diff changeset
198 return NULL;
73ae7a6d510e [svn] - don't fill in tuple fields with "".
nenolod
parents: 582
diff changeset
199
73ae7a6d510e [svn] - don't fill in tuple fields with "".
nenolod
parents: 582
diff changeset
200 return g_strdup(in);
73ae7a6d510e [svn] - don't fill in tuple fields with "".
nenolod
parents: 582
diff changeset
201 }
73ae7a6d510e [svn] - don't fill in tuple fields with "".
nenolod
parents: 582
diff changeset
202
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
203 static TitleInput* get_track_ti( const char* path, track_info_t const& info, int track )
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
204 {
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
205 TitleInput* ti = bmp_title_input_new();
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
206 if ( ti )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
207 {
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
208 ti->file_name = g_path_get_basename( path );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
209 ti->file_path = g_path_get_dirname ( path );
603
73ae7a6d510e [svn] - don't fill in tuple fields with "".
nenolod
parents: 582
diff changeset
210 ti->performer = selective_strdup( info.author );
73ae7a6d510e [svn] - don't fill in tuple fields with "".
nenolod
parents: 582
diff changeset
211 ti->album_name = selective_strdup( info.game );
73ae7a6d510e [svn] - don't fill in tuple fields with "".
nenolod
parents: 582
diff changeset
212 ti->track_name = selective_strdup( info.song ? info.song : ti->file_name );
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
213 if ( info.track_count > 1 )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
214 ti->track_number = track + 1;
603
73ae7a6d510e [svn] - don't fill in tuple fields with "".
nenolod
parents: 582
diff changeset
215 ti->comment = selective_strdup( info.copyright );
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
216 ti->genre = g_strconcat( "Console: ", info.system, NULL );
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
217
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
218 int length = info.length;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
219 if ( length <= 0 )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
220 length = info.intro_length + 2 * info.loop_length;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
221 if ( length <= 0 )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
222 length = audcfg.loop_length * 1000;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
223 else if ( length >= fade_threshold )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
224 length += fade_length;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
225 ti->length = length;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
226 }
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
227 return ti;
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
228 }
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
229
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
230 static char* format_and_free_ti( TitleInput* ti, int* length )
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
231 {
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
232 char* result = xmms_get_titlestring( xmms_get_gentitle_format(), ti );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
233 if ( result )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
234 *length = ti->length;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
235 bmp_title_input_free( ti );
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
236
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
237 return result;
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
238 }
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
239
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
240 static TitleInput *get_song_tuple( gchar *path )
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
241 {
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
242 TitleInput* result = 0;
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
243 File_Handler fh( path );
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
244 if ( !fh.load( gme_info_only ) )
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
245 {
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
246 track_info_t info;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
247 if ( !log_err( fh.emu->track_info( &info, fh.track ) ) )
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
248 result = get_track_ti( fh.path, info, fh.track );
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
249 }
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
250 return result;
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
251 }
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
252
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
253 static void get_song_info( char* path, char** title, int* length )
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
254 {
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
255 *length = -1;
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
256 *title = NULL;
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
257
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
258 TitleInput* ti = get_song_tuple( path );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
259 if ( ti )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
260 *title = format_and_free_ti( ti, length );
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
261 }
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
262
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
263 // Playback
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
264
561
914c96de3244 [svn] Convert plugins to use InputPlayback.output instead of InputPlugin.output
iabervon
parents: 559
diff changeset
265 static void* play_loop_track( gpointer arg )
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
266 {
561
914c96de3244 [svn] Convert plugins to use InputPlayback.output instead of InputPlugin.output
iabervon
parents: 559
diff changeset
267 InputPlayback *playback = (InputPlayback *) arg;
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
268 g_static_mutex_lock( &playback_mutex );
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
269
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
270 while ( console_ip_is_going && !emu->track_ended() )
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
271 {
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
272 // handle pending seek
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
273 long s = pending_seek;
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
274 pending_seek = -1; // TODO: use atomic swap
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
275 if ( s >= 0 )
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
276 {
561
914c96de3244 [svn] Convert plugins to use InputPlayback.output instead of InputPlugin.output
iabervon
parents: 559
diff changeset
277 playback->output->flush( s * 1000 );
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
278 emu->seek( s * 1000 );
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
279 }
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
280
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
281 // fill and play buffer of audio
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
282 // TODO: see if larger buffer helps efficiency
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
283 int const buf_size = 1024;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
284 Music_Emu::sample_t buf [buf_size];
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
285 emu->play( buf_size, buf );
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
286
561
914c96de3244 [svn] Convert plugins to use InputPlayback.output instead of InputPlugin.output
iabervon
parents: 559
diff changeset
287 produce_audio( playback->output->written_time(),
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
288 FMT_S16_NE, 1, sizeof buf, buf,
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
289 &console_ip_is_going );
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
290 }
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
291
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
292 // stop playing
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
293 unload_file();
561
914c96de3244 [svn] Convert plugins to use InputPlayback.output instead of InputPlugin.output
iabervon
parents: 559
diff changeset
294 playback->output->close_audio();
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
295 console_ip_is_going = 0;
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
296 g_static_mutex_unlock( &playback_mutex );
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
297 // TODO: should decode_thread be cleared here?
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
298 g_thread_exit( NULL );
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
299 return NULL;
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
300 }
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
301
561
914c96de3244 [svn] Convert plugins to use InputPlayback.output instead of InputPlugin.output
iabervon
parents: 559
diff changeset
302 static void play_file( InputPlayback *playback )
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
303 {
561
914c96de3244 [svn] Convert plugins to use InputPlayback.output instead of InputPlugin.output
iabervon
parents: 559
diff changeset
304 char* path = playback->filename;
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
305 unload_file();
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
306
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
307 // identify file
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
308 File_Handler fh( path );
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
309 if ( !fh.type )
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
310 return;
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
311
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
312 // select sample rate
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
313 long sample_rate = 0;
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
314 if ( fh.type == gme_spc_type )
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
315 sample_rate = 32000;
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
316 if ( audcfg.resample )
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
317 sample_rate = audcfg.resample_rate;
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
318 if ( !sample_rate )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
319 sample_rate = 44100;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
320
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
321 // create emulator and load file
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
322 if ( fh.load( sample_rate ) )
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
323 return;
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
324
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
325 // stereo echo depth
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
326 gme_set_stereo_depth( fh.emu, 1.0 / 100 * audcfg.echo );
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
327
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
328 // set equalizer
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
329 if ( audcfg.treble || audcfg.bass )
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
330 {
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
331 Music_Emu::equalizer_t eq;
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
332
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
333 // bass - logarithmic, 2 to 8194 Hz
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
334 double bass = 1.0 - (audcfg.bass / 200.0 + 0.5);
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
335 eq.bass = (long) (2.0 + pow( 2.0, bass * 13 ));
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
336
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
337 // treble - -50 to 0 to +5 dB
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
338 double treble = audcfg.treble / 100.0;
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
339 eq.treble = treble * (treble < 0 ? 50.0 : 5.0);
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
340
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
341 fh.emu->set_equalizer(eq);
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
342 }
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
343
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
344 // get info
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
345 int length = -1;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
346 track_info_t info;
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
347 if ( !log_err( fh.emu->track_info( &info, fh.track ) ) )
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
348 {
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
349 if ( fh.type == gme_spc_type && audcfg.ignore_spc_length )
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
350 info.length = -1;
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
351 TitleInput* ti = get_track_ti( fh.path, info, fh.track );
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
352 if ( ti )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
353 {
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
354 char* title = format_and_free_ti( ti, &length );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
355 if ( title )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
356 {
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
357 console_ip.set_info( title, length, fh.emu->voice_count() * 1000, sample_rate, 2 );
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
358 g_free( title );
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
359 }
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
360 }
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
361 }
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
362
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
363 // start track
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
364 if ( log_err( fh.emu->start_track( fh.track ) ) )
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
365 return;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
366 log_warning( fh.emu );
561
914c96de3244 [svn] Convert plugins to use InputPlayback.output instead of InputPlugin.output
iabervon
parents: 559
diff changeset
367 if ( !playback->output->open_audio( FMT_S16_NE, sample_rate, 2 ) )
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
368 return;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
369
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
370 // set fade time
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
371 if ( length <= 0 )
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
372 length = audcfg.loop_length * 1000;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
373 if ( length >= fade_threshold + fade_length )
648
0eca44731221 [svn] - fix timing on fades
nenolod
parents: 603
diff changeset
374 length -= fade_length / 2;
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
375 fh.emu->set_fade( length, fade_length );
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
376
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
377 // take ownership of emu
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
378 emu = fh.emu;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
379 fh.emu = 0;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
380
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
381 pending_seek = -1;
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
382 console_ip_is_going = 1;
582
f9e813a27f9f [svn] - pass a valid InputPlayback handle to the play thread
nenolod
parents: 561
diff changeset
383 decode_thread = g_thread_create( play_loop_track, playback, TRUE, NULL );
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
384 }
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
385
559
d5782f3bd760 [svn] Update plugins to the new input plugin API
iabervon
parents: 528
diff changeset
386 static void seek( InputPlayback * data, gint time )
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
387 {
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
388 // TODO: use thread-safe atomic set
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
389 pending_seek = time;
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
390 }
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
391
561
914c96de3244 [svn] Convert plugins to use InputPlayback.output instead of InputPlugin.output
iabervon
parents: 559
diff changeset
392 static void console_stop(InputPlayback *playback)
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
393 {
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
394 console_ip_is_going = 0;
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
395 if ( decode_thread )
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
396 {
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
397 g_thread_join( decode_thread );
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
398 decode_thread = NULL;
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
399 }
561
914c96de3244 [svn] Convert plugins to use InputPlayback.output instead of InputPlugin.output
iabervon
parents: 559
diff changeset
400 playback->output->close_audio();
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
401 unload_file();
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
402 }
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
403
561
914c96de3244 [svn] Convert plugins to use InputPlayback.output instead of InputPlugin.output
iabervon
parents: 559
diff changeset
404 static void console_pause(InputPlayback * playback, gshort p)
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
405 {
561
914c96de3244 [svn] Convert plugins to use InputPlayback.output instead of InputPlugin.output
iabervon
parents: 559
diff changeset
406 playback->output->pause(p);
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
407 }
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
408
561
914c96de3244 [svn] Convert plugins to use InputPlayback.output instead of InputPlugin.output
iabervon
parents: 559
diff changeset
409 static int get_time(InputPlayback *playback)
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
410 {
561
914c96de3244 [svn] Convert plugins to use InputPlayback.output instead of InputPlugin.output
iabervon
parents: 559
diff changeset
411 return console_ip_is_going ? playback->output->output_time() : -1;
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
412 }
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
413
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
414 static gint is_our_file_from_vfs( gchar* path, VFSFile* fd )
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
415 {
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
416 gint result = 0;
385
ac806e416c48 [svn] - some improvements for chiptune expansion efficiency
nenolod
parents: 382
diff changeset
417 File_Handler fh( path, fd, TRUE );
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
418 if ( fh.type )
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
419 {
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
420 if ( fh.track_specified || fh.type->track_count == 1 )
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
421 {
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
422 // don't even need to read file if track is specified or
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
423 // that file format can't have more than one track per file
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
424 result = 1;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
425 }
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
426 else if ( !fh.load( gme_info_only ) )
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
427 {
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
428 // format requires reading file info to get track count
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
429 if ( fh.emu->track_count() == 1 )
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
430 {
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
431 result = 1;
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
432 }
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
433 else
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
434 {
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
435 // for multi-track types, add each track to playlist
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
436 for (int i = 0; i < fh.emu->track_count(); i++)
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
437 {
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
438 gchar _buf[path_max];
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
439 g_snprintf(_buf, path_max, "%s?%d", fh.path, i);
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
440
363
958855dae693 [svn] - fix other plugins dependant on the playlist framework
nenolod
parents: 355
diff changeset
441 playlist_add_url(playlist_get_active(), _buf);
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
442 }
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
443 result = -1;
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
444 }
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
445 }
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
446 }
382
66e09ad0944e [svn] - really fix HES/other multitrack this time
nenolod
parents: 381
diff changeset
447 else if (fh.track_specified)
66e09ad0944e [svn] - really fix HES/other multitrack this time
nenolod
parents: 381
diff changeset
448 {
66e09ad0944e [svn] - really fix HES/other multitrack this time
nenolod
parents: 381
diff changeset
449 result = 1;
66e09ad0944e [svn] - really fix HES/other multitrack this time
nenolod
parents: 381
diff changeset
450 }
66e09ad0944e [svn] - really fix HES/other multitrack this time
nenolod
parents: 381
diff changeset
451
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
452 return result;
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
453 }
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
454
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
455 // Setup
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
456
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
457 static void console_init(void)
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
458 {
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
459 console_cfg_load();
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
460 }
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
461
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
462 extern "C" void console_aboutbox(void)
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
463 {
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
464 static GtkWidget * aboutbox = NULL;
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
465
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
466 if (!aboutbox)
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
467 {
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
468 aboutbox = xmms_show_message(_("About the Console Music Decoder"),
341
986f098da058 [svn] - merge in blargg's changes
nenolod
parents: 332
diff changeset
469 _("Console music decoder engine based on Game_Music_Emu 0.5.2.\n"
355
92848bda520d [svn] Move supported formats to plugin info, rename plugin to 'Game console audio module decoder'.
kiyoshi
parents: 341
diff changeset
470 "Supported formats: AY, GBS, GYM, HES, KSS, NSF, NSFE, SAP, SPC, VGM, VGZ\n"
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
471 "Audacious implementation by: William Pitcock <nenolod@nenolod.net>, \n"
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
472 " Shay Green <gblargg@gmail.com>"),
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
473 _("Ok"),
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
474 FALSE, NULL, NULL);
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
475 gtk_signal_connect(GTK_OBJECT(aboutbox), "destroy",
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
476 (GCallback)gtk_widget_destroyed, &aboutbox);
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
477 }
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
478 }
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
479
378
899e285f4be5 [svn] - extension assist for libconsole
nenolod
parents: 363
diff changeset
480 gchar *gme_fmts[] = { "ay", "gbs", "gym", "hes", "kss", "nsf", "nsfe",
899e285f4be5 [svn] - extension assist for libconsole
nenolod
parents: 363
diff changeset
481 "sap", "spc", "vgm", "vgz", NULL };
899e285f4be5 [svn] - extension assist for libconsole
nenolod
parents: 363
diff changeset
482
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
483 InputPlugin console_ip =
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
484 {
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
485 NULL,
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
486 NULL,
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
487 NULL,
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
488 console_init,
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
489 console_aboutbox,
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
490 console_cfg_ui,
332
626f9f4d79a8 [svn] Remove old-style is_our_file() where a new-style is_our_fd() exists
kiyoshi
parents: 324
diff changeset
491 NULL,
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
492 NULL,
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
493 play_file,
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
494 console_stop,
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
495 console_pause,
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
496 seek,
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
497 NULL,
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
498 get_time,
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
499 NULL,
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
500 NULL,
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
501 NULL,
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
502 NULL,
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
503 NULL,
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
504 NULL,
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
505 NULL,
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
506 get_song_info,
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
507 NULL,
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
508 NULL,
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
509 get_song_tuple,
316
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
510 NULL,
fb513e10174e [svn] - merge libconsole-blargg into mainline libconsole:
nenolod
parents: 12
diff changeset
511 NULL,
378
899e285f4be5 [svn] - extension assist for libconsole
nenolod
parents: 363
diff changeset
512 is_our_file_from_vfs,
899e285f4be5 [svn] - extension assist for libconsole
nenolod
parents: 363
diff changeset
513 gme_fmts
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
514 };
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
515
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
516 extern "C" InputPlugin *get_iplugin_info(void)
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
517 {
355
92848bda520d [svn] Move supported formats to plugin info, rename plugin to 'Game console audio module decoder'.
kiyoshi
parents: 341
diff changeset
518 console_ip.description = g_strdup_printf(_("Game console audio module decoder"));
0
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
519 return &console_ip;
13389e613d67 [svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff changeset
520 }