Mercurial > audlegacy
annotate Plugins/Input/console/Audacious_Driver.cpp @ 481:bb3698dfd455 trunk
[svn] Tag length enforcement by null-terminating the strings. By Kiyoshi Aman <kiyoshi.aman -at- gmail.com>.
| author | chainsaw |
|---|---|
| date | Sat, 21 Jan 2006 10:03:15 -0800 |
| parents | 0b9507985f0d |
| children | 7c5e886205ef |
| rev | line source |
|---|---|
|
90
252843aac42f
[svn] Import the initial sources for console music support.
nenolod
parents:
diff
changeset
|
1 /* |
|
252843aac42f
[svn] Import the initial sources for console music support.
nenolod
parents:
diff
changeset
|
2 * Audacious: Cross platform multimedia player |
|
252843aac42f
[svn] Import the initial sources for console music support.
nenolod
parents:
diff
changeset
|
3 * Copyright (c) 2005 Audacious Team |
|
252843aac42f
[svn] Import the initial sources for console music support.
nenolod
parents:
diff
changeset
|
4 * |
|
252843aac42f
[svn] Import the initial sources for console music support.
nenolod
parents:
diff
changeset
|
5 * Driver for Game_Music_Emu library. See details at: |
|
252843aac42f
[svn] Import the initial sources for console music support.
nenolod
parents:
diff
changeset
|
6 * http://www.slack.net/~ant/libs/ |
|
252843aac42f
[svn] Import the initial sources for console music support.
nenolod
parents:
diff
changeset
|
7 */ |
|
252843aac42f
[svn] Import the initial sources for console music support.
nenolod
parents:
diff
changeset
|
8 |
| 94 | 9 #include "Audacious_Driver.h" |
|
90
252843aac42f
[svn] Import the initial sources for console music support.
nenolod
parents:
diff
changeset
|
10 |
|
98
e42694a28331
[svn] More progress -- now loads as an audacious module. :)
nenolod
parents:
96
diff
changeset
|
11 extern "C" { |
|
e42694a28331
[svn] More progress -- now loads as an audacious module. :)
nenolod
parents:
96
diff
changeset
|
12 |
| 109 | 13 #include <glib.h> |
| 96 | 14 #include <glib/gi18n.h> |
| 109 | 15 #include <gtk/gtk.h> |
|
319
1e642d74d68c
[svn] Do not abort if libmpc is not found, just disable musepack plugin.
chainsaw
parents:
288
diff
changeset
|
16 #include "libaudacious/configdb.h" |
| 94 | 17 #include "libaudacious/util.h" |
| 18 #include "libaudacious/titlestring.h" | |
|
366
4a9139a7b53e
[svn] Use file magic instead of extensions (Phase 2).
chainsaw
parents:
365
diff
changeset
|
19 #include "libaudacious/vfs.h" |
| 145 | 20 #include "audacious/input.h" |
| 95 | 21 #include "audacious/output.h" |
| 288 | 22 #include "libaudcore/playback.h" |
| 94 | 23 |
|
98
e42694a28331
[svn] More progress -- now loads as an audacious module. :)
nenolod
parents:
96
diff
changeset
|
24 }; |
|
e42694a28331
[svn] More progress -- now loads as an audacious module. :)
nenolod
parents:
96
diff
changeset
|
25 |
| 145 | 26 struct AudaciousConsoleConfig audcfg = { 180, FALSE, 32000 }; |
| 27 | |
| 94 | 28 #include <cstring> |
|
477
8fc500c08b61
[svn] SPC length detection c/o Kiyoshi Aman <kiyoshi.aman -at- gmail.com>
nenolod
parents:
473
diff
changeset
|
29 #include <cstdlib> |
|
8fc500c08b61
[svn] SPC length detection c/o Kiyoshi Aman <kiyoshi.aman -at- gmail.com>
nenolod
parents:
473
diff
changeset
|
30 #include <cctype> |
| 94 | 31 |
| 32 static Spc_Emu *spc = NULL; | |
| 213 | 33 static Nsf_Emu *nsf = NULL; |
| 214 | 34 static Gbs_Emu *gbs = NULL; |
| 334 | 35 static Gym_Emu *gym = NULL; |
| 364 | 36 static Vgm_Emu *vgm = NULL; |
| 95 | 37 static GThread *decode_thread; |
| 213 | 38 GStaticMutex playback_mutex = G_STATIC_MUTEX_INIT; |
| 95 | 39 |
|
147
6fe2bfbe6fc2
[svn] Move SPC-specific code into SPC-specific routines.
nenolod
parents:
146
diff
changeset
|
40 static void *play_loop_spc(gpointer arg); |
| 213 | 41 static void *play_loop_nsf(gpointer arg); |
| 214 | 42 static void *play_loop_gbs(gpointer arg); |
| 334 | 43 static void *play_loop_gym(gpointer arg); |
| 364 | 44 static void *play_loop_vgm(gpointer arg); |
| 100 | 45 static void console_init(void); |
| 109 | 46 extern "C" void console_aboutbox(void); |
| 96 | 47 static void console_stop(void); |
| 48 static void console_pause(gshort p); | |
| 49 static int get_time(void); | |
| 103 | 50 static gboolean console_ip_is_going; |
| 100 | 51 extern InputPlugin console_ip; |
|
147
6fe2bfbe6fc2
[svn] Move SPC-specific code into SPC-specific routines.
nenolod
parents:
146
diff
changeset
|
52 static int playing_type; |
| 100 | 53 |
| 94 | 54 static int is_our_file(gchar *filename) |
| 55 { | |
|
366
4a9139a7b53e
[svn] Use file magic instead of extensions (Phase 2).
chainsaw
parents:
365
diff
changeset
|
56 VFSFile *file; |
|
4a9139a7b53e
[svn] Use file magic instead of extensions (Phase 2).
chainsaw
parents:
365
diff
changeset
|
57 gchar magic[4]; |
|
4a9139a7b53e
[svn] Use file magic instead of extensions (Phase 2).
chainsaw
parents:
365
diff
changeset
|
58 if (file = vfs_fopen(filename, "rb")) { |
|
4a9139a7b53e
[svn] Use file magic instead of extensions (Phase 2).
chainsaw
parents:
365
diff
changeset
|
59 vfs_fread(magic, 1, 4, file); |
|
4a9139a7b53e
[svn] Use file magic instead of extensions (Phase 2).
chainsaw
parents:
365
diff
changeset
|
60 if (!strncmp(magic, "SNES", 4)) { |
|
4a9139a7b53e
[svn] Use file magic instead of extensions (Phase 2).
chainsaw
parents:
365
diff
changeset
|
61 vfs_fclose(file); |
| 213 | 62 return PLAY_TYPE_SPC; |
|
366
4a9139a7b53e
[svn] Use file magic instead of extensions (Phase 2).
chainsaw
parents:
365
diff
changeset
|
63 } |
|
4a9139a7b53e
[svn] Use file magic instead of extensions (Phase 2).
chainsaw
parents:
365
diff
changeset
|
64 if (!strncmp(magic, "NESM", 4)) { |
|
4a9139a7b53e
[svn] Use file magic instead of extensions (Phase 2).
chainsaw
parents:
365
diff
changeset
|
65 vfs_fclose(file); |
| 213 | 66 return PLAY_TYPE_NSF; |
|
366
4a9139a7b53e
[svn] Use file magic instead of extensions (Phase 2).
chainsaw
parents:
365
diff
changeset
|
67 } |
|
4a9139a7b53e
[svn] Use file magic instead of extensions (Phase 2).
chainsaw
parents:
365
diff
changeset
|
68 if (!strncmp(magic, "GYMX", 4)) { |
|
4a9139a7b53e
[svn] Use file magic instead of extensions (Phase 2).
chainsaw
parents:
365
diff
changeset
|
69 vfs_fclose(file); |
|
4a9139a7b53e
[svn] Use file magic instead of extensions (Phase 2).
chainsaw
parents:
365
diff
changeset
|
70 return PLAY_TYPE_GYM; |
|
4a9139a7b53e
[svn] Use file magic instead of extensions (Phase 2).
chainsaw
parents:
365
diff
changeset
|
71 } |
|
4a9139a7b53e
[svn] Use file magic instead of extensions (Phase 2).
chainsaw
parents:
365
diff
changeset
|
72 if (!strncmp(magic, "GBS", 3)) { |
|
4a9139a7b53e
[svn] Use file magic instead of extensions (Phase 2).
chainsaw
parents:
365
diff
changeset
|
73 vfs_fclose(file); |
| 214 | 74 return PLAY_TYPE_GBS; |
|
366
4a9139a7b53e
[svn] Use file magic instead of extensions (Phase 2).
chainsaw
parents:
365
diff
changeset
|
75 } |
|
4a9139a7b53e
[svn] Use file magic instead of extensions (Phase 2).
chainsaw
parents:
365
diff
changeset
|
76 if (!strncmp(magic, "Vgm", 3)) { |
|
4a9139a7b53e
[svn] Use file magic instead of extensions (Phase 2).
chainsaw
parents:
365
diff
changeset
|
77 vfs_fclose(file); |
| 364 | 78 return PLAY_TYPE_VGM; |
|
366
4a9139a7b53e
[svn] Use file magic instead of extensions (Phase 2).
chainsaw
parents:
365
diff
changeset
|
79 } |
|
4a9139a7b53e
[svn] Use file magic instead of extensions (Phase 2).
chainsaw
parents:
365
diff
changeset
|
80 vfs_fclose(file); |
| 94 | 81 } |
| 82 return 0; | |
| 83 } | |
| 84 | |
|
477
8fc500c08b61
[svn] SPC length detection c/o Kiyoshi Aman <kiyoshi.aman -at- gmail.com>
nenolod
parents:
473
diff
changeset
|
85 static gint strtoi(gchar *buf,size_t len) { |
|
8fc500c08b61
[svn] SPC length detection c/o Kiyoshi Aman <kiyoshi.aman -at- gmail.com>
nenolod
parents:
473
diff
changeset
|
86 guint num = 0; |
|
8fc500c08b61
[svn] SPC length detection c/o Kiyoshi Aman <kiyoshi.aman -at- gmail.com>
nenolod
parents:
473
diff
changeset
|
87 while (len && isdigit(*buf)) { |
|
8fc500c08b61
[svn] SPC length detection c/o Kiyoshi Aman <kiyoshi.aman -at- gmail.com>
nenolod
parents:
473
diff
changeset
|
88 num *= 10; |
|
8fc500c08b61
[svn] SPC length detection c/o Kiyoshi Aman <kiyoshi.aman -at- gmail.com>
nenolod
parents:
473
diff
changeset
|
89 num += *buf - '0'; |
|
8fc500c08b61
[svn] SPC length detection c/o Kiyoshi Aman <kiyoshi.aman -at- gmail.com>
nenolod
parents:
473
diff
changeset
|
90 buf++; |
|
8fc500c08b61
[svn] SPC length detection c/o Kiyoshi Aman <kiyoshi.aman -at- gmail.com>
nenolod
parents:
473
diff
changeset
|
91 len--; |
|
8fc500c08b61
[svn] SPC length detection c/o Kiyoshi Aman <kiyoshi.aman -at- gmail.com>
nenolod
parents:
473
diff
changeset
|
92 } |
|
8fc500c08b61
[svn] SPC length detection c/o Kiyoshi Aman <kiyoshi.aman -at- gmail.com>
nenolod
parents:
473
diff
changeset
|
93 return num; |
|
8fc500c08b61
[svn] SPC length detection c/o Kiyoshi Aman <kiyoshi.aman -at- gmail.com>
nenolod
parents:
473
diff
changeset
|
94 } |
|
8fc500c08b61
[svn] SPC length detection c/o Kiyoshi Aman <kiyoshi.aman -at- gmail.com>
nenolod
parents:
473
diff
changeset
|
95 |
| 148 | 96 static gchar *get_title_spc(gchar *filename) |
| 94 | 97 { |
| 98 gchar *title; | |
|
477
8fc500c08b61
[svn] SPC length detection c/o Kiyoshi Aman <kiyoshi.aman -at- gmail.com>
nenolod
parents:
473
diff
changeset
|
99 Spc_Reader reader; |
| 94 | 100 Spc_Emu::header_t header; |
| 101 | |
| 102 reader.open(filename); | |
| 103 reader.read(&header, sizeof(header)); | |
| 104 | |
|
363
eaaee9e0519c
[svn] Properly fall back to file name if the tag information is invalid (SPC).
chainsaw
parents:
362
diff
changeset
|
105 if (header.version > 10) |
| 104 | 106 { |
| 107 TitleInput *tinput; | |
| 108 | |
| 109 tinput = bmp_title_input_new(); | |
|
481
bb3698dfd455
[svn] Tag length enforcement by null-terminating the strings. By Kiyoshi Aman <kiyoshi.aman -at- gmail.com>.
chainsaw
parents:
479
diff
changeset
|
110 |
|
bb3698dfd455
[svn] Tag length enforcement by null-terminating the strings. By Kiyoshi Aman <kiyoshi.aman -at- gmail.com>.
chainsaw
parents:
479
diff
changeset
|
111 header.author[31] = '\0'; |
|
bb3698dfd455
[svn] Tag length enforcement by null-terminating the strings. By Kiyoshi Aman <kiyoshi.aman -at- gmail.com>.
chainsaw
parents:
479
diff
changeset
|
112 header.game[31] = '\0'; |
|
bb3698dfd455
[svn] Tag length enforcement by null-terminating the strings. By Kiyoshi Aman <kiyoshi.aman -at- gmail.com>.
chainsaw
parents:
479
diff
changeset
|
113 header.song[31] = '\0'; |
| 104 | 114 |
|
421
147325df7461
[svn] SPC titleinput fix. Contributed by Kiyoshi Aman <kiyoshi.aman -at- gmail.com>.
nenolod
parents:
417
diff
changeset
|
115 tinput->performer = g_strdup(header.author); |
| 104 | 116 tinput->album_name = g_strdup(header.game); |
| 117 tinput->track_name = g_strdup(header.song); | |
| 94 | 118 |
| 104 | 119 tinput->file_name = g_path_get_basename(filename); |
| 120 tinput->file_path = g_path_get_dirname(filename); | |
| 121 | |
| 122 title = xmms_get_titlestring(xmms_get_gentitle_format(), | |
| 123 tinput); | |
| 124 | |
| 125 g_free(tinput); | |
| 126 } | |
| 127 else | |
| 213 | 128 title = g_path_get_basename(filename); |
| 129 | |
| 130 return title; | |
| 131 } | |
| 99 | 132 |
| 213 | 133 static gchar *get_title_nsf(gchar *filename) |
| 134 { | |
| 135 gchar *title; | |
|
479
0b9507985f0d
[svn] Use the VFS subsystem and delete the unused demo source.
chainsaw
parents:
477
diff
changeset
|
136 Nsf_Reader reader; |
| 473 | 137 Nsf_Emu::header_t header; |
| 138 | |
| 139 reader.open(filename); | |
| 140 reader.read(&header, sizeof(header)); | |
| 141 | |
| 142 if (header.game) | |
| 143 { | |
| 144 TitleInput *tinput; | |
| 145 | |
| 146 tinput = bmp_title_input_new(); | |
|
481
bb3698dfd455
[svn] Tag length enforcement by null-terminating the strings. By Kiyoshi Aman <kiyoshi.aman -at- gmail.com>.
chainsaw
parents:
479
diff
changeset
|
147 |
|
bb3698dfd455
[svn] Tag length enforcement by null-terminating the strings. By Kiyoshi Aman <kiyoshi.aman -at- gmail.com>.
chainsaw
parents:
479
diff
changeset
|
148 header.author[31] = '\0'; |
|
bb3698dfd455
[svn] Tag length enforcement by null-terminating the strings. By Kiyoshi Aman <kiyoshi.aman -at- gmail.com>.
chainsaw
parents:
479
diff
changeset
|
149 header.copyright[31] = '\0'; |
|
bb3698dfd455
[svn] Tag length enforcement by null-terminating the strings. By Kiyoshi Aman <kiyoshi.aman -at- gmail.com>.
chainsaw
parents:
479
diff
changeset
|
150 header.game[31] = '\0'; |
| 473 | 151 |
| 152 tinput->performer = g_strdup(header.author); | |
| 153 tinput->album_name = g_strdup(header.copyright); | |
| 154 tinput->track_name = g_strdup(header.game); | |
| 155 | |
| 156 tinput->file_name = g_path_get_basename(filename); | |
| 157 tinput->file_path = g_path_get_dirname(filename); | |
| 158 | |
| 159 title = xmms_get_titlestring(xmms_get_gentitle_format(), | |
| 160 tinput); | |
| 161 | |
| 162 g_free(tinput); | |
| 163 } | |
| 164 else | |
| 165 title = g_path_get_basename(filename); | |
| 166 | |
| 94 | 167 return title; |
| 168 } | |
| 95 | 169 |
| 214 | 170 static gchar *get_title_gbs(gchar *filename) |
| 171 { | |
| 172 gchar *title; | |
|
479
0b9507985f0d
[svn] Use the VFS subsystem and delete the unused demo source.
chainsaw
parents:
477
diff
changeset
|
173 Gbs_Reader reader; |
|
472
98ebf4727a64
[svn] Length detection for VGM; tag reading for GBS.
chainsaw
parents:
469
diff
changeset
|
174 Gbs_Emu::header_t header; |
|
98ebf4727a64
[svn] Length detection for VGM; tag reading for GBS.
chainsaw
parents:
469
diff
changeset
|
175 |
|
98ebf4727a64
[svn] Length detection for VGM; tag reading for GBS.
chainsaw
parents:
469
diff
changeset
|
176 reader.open(filename); |
|
98ebf4727a64
[svn] Length detection for VGM; tag reading for GBS.
chainsaw
parents:
469
diff
changeset
|
177 reader.read(&header, sizeof(header)); |
|
98ebf4727a64
[svn] Length detection for VGM; tag reading for GBS.
chainsaw
parents:
469
diff
changeset
|
178 |
|
98ebf4727a64
[svn] Length detection for VGM; tag reading for GBS.
chainsaw
parents:
469
diff
changeset
|
179 if (header.game) |
|
98ebf4727a64
[svn] Length detection for VGM; tag reading for GBS.
chainsaw
parents:
469
diff
changeset
|
180 { |
|
98ebf4727a64
[svn] Length detection for VGM; tag reading for GBS.
chainsaw
parents:
469
diff
changeset
|
181 TitleInput *tinput; |
|
98ebf4727a64
[svn] Length detection for VGM; tag reading for GBS.
chainsaw
parents:
469
diff
changeset
|
182 |
|
98ebf4727a64
[svn] Length detection for VGM; tag reading for GBS.
chainsaw
parents:
469
diff
changeset
|
183 tinput = bmp_title_input_new(); |
|
481
bb3698dfd455
[svn] Tag length enforcement by null-terminating the strings. By Kiyoshi Aman <kiyoshi.aman -at- gmail.com>.
chainsaw
parents:
479
diff
changeset
|
184 |
|
bb3698dfd455
[svn] Tag length enforcement by null-terminating the strings. By Kiyoshi Aman <kiyoshi.aman -at- gmail.com>.
chainsaw
parents:
479
diff
changeset
|
185 header.author[31] = '\0'; |
|
bb3698dfd455
[svn] Tag length enforcement by null-terminating the strings. By Kiyoshi Aman <kiyoshi.aman -at- gmail.com>.
chainsaw
parents:
479
diff
changeset
|
186 header.copyright[31] = '\0'; |
|
bb3698dfd455
[svn] Tag length enforcement by null-terminating the strings. By Kiyoshi Aman <kiyoshi.aman -at- gmail.com>.
chainsaw
parents:
479
diff
changeset
|
187 header.game[31] = '\0'; |
|
472
98ebf4727a64
[svn] Length detection for VGM; tag reading for GBS.
chainsaw
parents:
469
diff
changeset
|
188 |
|
98ebf4727a64
[svn] Length detection for VGM; tag reading for GBS.
chainsaw
parents:
469
diff
changeset
|
189 tinput->performer = g_strdup(header.author); |
|
98ebf4727a64
[svn] Length detection for VGM; tag reading for GBS.
chainsaw
parents:
469
diff
changeset
|
190 tinput->album_name = g_strdup(header.copyright); |
|
98ebf4727a64
[svn] Length detection for VGM; tag reading for GBS.
chainsaw
parents:
469
diff
changeset
|
191 tinput->track_name = g_strdup(header.game); |
|
98ebf4727a64
[svn] Length detection for VGM; tag reading for GBS.
chainsaw
parents:
469
diff
changeset
|
192 |
|
98ebf4727a64
[svn] Length detection for VGM; tag reading for GBS.
chainsaw
parents:
469
diff
changeset
|
193 tinput->file_name = g_path_get_basename(filename); |
|
98ebf4727a64
[svn] Length detection for VGM; tag reading for GBS.
chainsaw
parents:
469
diff
changeset
|
194 tinput->file_path = g_path_get_dirname(filename); |
|
98ebf4727a64
[svn] Length detection for VGM; tag reading for GBS.
chainsaw
parents:
469
diff
changeset
|
195 |
|
98ebf4727a64
[svn] Length detection for VGM; tag reading for GBS.
chainsaw
parents:
469
diff
changeset
|
196 title = xmms_get_titlestring(xmms_get_gentitle_format(), |
|
98ebf4727a64
[svn] Length detection for VGM; tag reading for GBS.
chainsaw
parents:
469
diff
changeset
|
197 tinput); |
|
98ebf4727a64
[svn] Length detection for VGM; tag reading for GBS.
chainsaw
parents:
469
diff
changeset
|
198 |
|
98ebf4727a64
[svn] Length detection for VGM; tag reading for GBS.
chainsaw
parents:
469
diff
changeset
|
199 g_free(tinput); |
|
98ebf4727a64
[svn] Length detection for VGM; tag reading for GBS.
chainsaw
parents:
469
diff
changeset
|
200 } |
|
98ebf4727a64
[svn] Length detection for VGM; tag reading for GBS.
chainsaw
parents:
469
diff
changeset
|
201 else |
|
98ebf4727a64
[svn] Length detection for VGM; tag reading for GBS.
chainsaw
parents:
469
diff
changeset
|
202 title = g_path_get_basename(filename); |
|
98ebf4727a64
[svn] Length detection for VGM; tag reading for GBS.
chainsaw
parents:
469
diff
changeset
|
203 |
| 214 | 204 return title; |
| 205 } | |
| 206 | |
| 334 | 207 static gchar *get_title_gym(gchar *filename) |
| 208 { | |
| 209 gchar *title; | |
|
479
0b9507985f0d
[svn] Use the VFS subsystem and delete the unused demo source.
chainsaw
parents:
477
diff
changeset
|
210 Gym_Reader reader; |
| 365 | 211 Gym_Emu::header_t header; |
| 212 | |
| 213 reader.open(filename); | |
| 214 reader.read(&header, sizeof(header)); | |
| 215 | |
| 216 if (header.song) | |
| 217 { | |
| 218 TitleInput *tinput; | |
| 219 | |
| 220 tinput = bmp_title_input_new(); | |
|
481
bb3698dfd455
[svn] Tag length enforcement by null-terminating the strings. By Kiyoshi Aman <kiyoshi.aman -at- gmail.com>.
chainsaw
parents:
479
diff
changeset
|
221 |
|
bb3698dfd455
[svn] Tag length enforcement by null-terminating the strings. By Kiyoshi Aman <kiyoshi.aman -at- gmail.com>.
chainsaw
parents:
479
diff
changeset
|
222 header.game[31] = '\0'; |
|
bb3698dfd455
[svn] Tag length enforcement by null-terminating the strings. By Kiyoshi Aman <kiyoshi.aman -at- gmail.com>.
chainsaw
parents:
479
diff
changeset
|
223 header.copyright[31] = '\0'; |
|
bb3698dfd455
[svn] Tag length enforcement by null-terminating the strings. By Kiyoshi Aman <kiyoshi.aman -at- gmail.com>.
chainsaw
parents:
479
diff
changeset
|
224 header.song[31] = '\0'; |
| 365 | 225 |
| 226 tinput->performer = g_strdup(header.game); | |
|
469
fc98032223d1
[svn] Simplify magic reader and get GYM tag reading right.
chainsaw
parents:
421
diff
changeset
|
227 tinput->album_name = g_strdup(header.copyright); |
| 365 | 228 tinput->track_name = g_strdup(header.song); |
| 229 | |
| 230 tinput->file_name = g_path_get_basename(filename); | |
| 231 tinput->file_path = g_path_get_dirname(filename); | |
| 232 | |
| 233 title = xmms_get_titlestring(xmms_get_gentitle_format(), | |
| 234 tinput); | |
| 235 | |
| 236 g_free(tinput); | |
| 237 } | |
| 238 else | |
| 239 title = g_path_get_basename(filename); | |
| 240 | |
| 334 | 241 return title; |
| 242 } | |
| 243 | |
| 364 | 244 static gchar *get_title_vgm(gchar *filename) |
| 245 { | |
| 246 gchar *title; | |
| 247 title = g_path_get_basename(filename); | |
| 248 return title; | |
| 249 } | |
| 250 | |
| 148 | 251 static gchar *get_title(gchar *filename) |
| 252 { | |
| 213 | 253 switch (is_our_file(filename)) |
| 148 | 254 { |
| 213 | 255 case PLAY_TYPE_SPC: |
| 148 | 256 return get_title_spc(filename); |
| 213 | 257 break; |
| 258 case PLAY_TYPE_NSF: | |
| 259 return get_title_nsf(filename); | |
| 260 break; | |
| 214 | 261 case PLAY_TYPE_GBS: |
| 262 return get_title_gbs(filename); | |
| 263 break; | |
| 334 | 264 case PLAY_TYPE_GYM: |
| 265 return get_title_gym(filename); | |
| 266 break; | |
| 364 | 267 case PLAY_TYPE_VGM: |
| 268 return get_title_vgm(filename); | |
| 269 break; | |
| 148 | 270 } |
| 271 | |
| 272 return NULL; | |
| 273 } | |
| 274 | |
| 95 | 275 static void get_song_info(char *filename, char **title, int *length) |
| 276 { | |
| 277 (*title) = get_title(filename); | |
| 145 | 278 |
| 279 if (audcfg.loop_length) | |
| 280 (*length) = audcfg.loop_length; | |
| 281 else | |
| 282 (*length) = -1; | |
| 95 | 283 } |
| 284 | |
|
147
6fe2bfbe6fc2
[svn] Move SPC-specific code into SPC-specific routines.
nenolod
parents:
146
diff
changeset
|
285 static void play_file_spc(char *filename) |
| 95 | 286 { |
|
106
d2b88d78ccd7
[svn] Tell the player that the decoder has fired up :)
nenolod
parents:
105
diff
changeset
|
287 gchar *name; |
|
477
8fc500c08b61
[svn] SPC length detection c/o Kiyoshi Aman <kiyoshi.aman -at- gmail.com>
nenolod
parents:
473
diff
changeset
|
288 Spc_Reader reader; |
| 95 | 289 Spc_Emu::header_t header; |
| 149 | 290 gint samplerate; |
| 291 | |
| 292 if (audcfg.resample == TRUE) | |
| 293 samplerate = audcfg.resample_rate; | |
| 294 else | |
| 295 samplerate = Spc_Emu::native_sample_rate; | |
| 95 | 296 |
| 297 reader.open(filename); | |
| 298 reader.read(&header, sizeof(header)); | |
| 299 | |
| 300 spc = new Spc_Emu; | |
| 149 | 301 spc->init(samplerate); |
| 95 | 302 spc->load(header, reader); |
| 303 spc->start_track(0); | |
| 304 | |
| 103 | 305 console_ip_is_going = TRUE; |
| 306 | |
|
106
d2b88d78ccd7
[svn] Tell the player that the decoder has fired up :)
nenolod
parents:
105
diff
changeset
|
307 name = get_title(filename); |
|
d2b88d78ccd7
[svn] Tell the player that the decoder has fired up :)
nenolod
parents:
105
diff
changeset
|
308 |
|
477
8fc500c08b61
[svn] SPC length detection c/o Kiyoshi Aman <kiyoshi.aman -at- gmail.com>
nenolod
parents:
473
diff
changeset
|
309 spc->length = strtoi(header.len_secs,3); |
|
8fc500c08b61
[svn] SPC length detection c/o Kiyoshi Aman <kiyoshi.aman -at- gmail.com>
nenolod
parents:
473
diff
changeset
|
310 |
|
8fc500c08b61
[svn] SPC length detection c/o Kiyoshi Aman <kiyoshi.aman -at- gmail.com>
nenolod
parents:
473
diff
changeset
|
311 if (spc->length > 0) |
|
8fc500c08b61
[svn] SPC length detection c/o Kiyoshi Aman <kiyoshi.aman -at- gmail.com>
nenolod
parents:
473
diff
changeset
|
312 console_ip.set_info(name, spc->length * 1000, |
|
8fc500c08b61
[svn] SPC length detection c/o Kiyoshi Aman <kiyoshi.aman -at- gmail.com>
nenolod
parents:
473
diff
changeset
|
313 spc->voice_count() * 1000, samplerate, 2); |
|
8fc500c08b61
[svn] SPC length detection c/o Kiyoshi Aman <kiyoshi.aman -at- gmail.com>
nenolod
parents:
473
diff
changeset
|
314 else if (audcfg.loop_length) |
| 145 | 315 console_ip.set_info(name, audcfg.loop_length * 1000, |
| 149 | 316 spc->voice_count() * 1000, samplerate, 2); |
| 145 | 317 else |
| 149 | 318 console_ip.set_info(name, -1, spc->voice_count() * 1000, |
| 319 samplerate, 2); | |
|
106
d2b88d78ccd7
[svn] Tell the player that the decoder has fired up :)
nenolod
parents:
105
diff
changeset
|
320 |
|
d2b88d78ccd7
[svn] Tell the player that the decoder has fired up :)
nenolod
parents:
105
diff
changeset
|
321 g_free(name); |
|
d2b88d78ccd7
[svn] Tell the player that the decoder has fired up :)
nenolod
parents:
105
diff
changeset
|
322 |
|
417
8ddd961ef0ff
[svn] Use FMT_S16_NE instead of unnecessary #ifdef WORDS_BIGENDIAN trickery.
chainsaw
parents:
371
diff
changeset
|
323 if (!console_ip.output->open_audio(FMT_S16_NE, samplerate, 2)) |
| 100 | 324 return; |
|
133
3fb426494de8
[svn] Open the output channel before firing up the thread.
nenolod
parents:
109
diff
changeset
|
325 |
|
147
6fe2bfbe6fc2
[svn] Move SPC-specific code into SPC-specific routines.
nenolod
parents:
146
diff
changeset
|
326 playing_type = PLAY_TYPE_SPC; |
|
6fe2bfbe6fc2
[svn] Move SPC-specific code into SPC-specific routines.
nenolod
parents:
146
diff
changeset
|
327 |
|
6fe2bfbe6fc2
[svn] Move SPC-specific code into SPC-specific routines.
nenolod
parents:
146
diff
changeset
|
328 decode_thread = g_thread_create(play_loop_spc, spc, TRUE, NULL); |
|
6fe2bfbe6fc2
[svn] Move SPC-specific code into SPC-specific routines.
nenolod
parents:
146
diff
changeset
|
329 } |
|
6fe2bfbe6fc2
[svn] Move SPC-specific code into SPC-specific routines.
nenolod
parents:
146
diff
changeset
|
330 |
| 213 | 331 static void play_file_nsf(char *filename) |
| 332 { | |
| 333 gchar *name; | |
|
479
0b9507985f0d
[svn] Use the VFS subsystem and delete the unused demo source.
chainsaw
parents:
477
diff
changeset
|
334 Nsf_Reader reader; |
| 213 | 335 Nsf_Emu::header_t header; |
| 336 gint samplerate; | |
| 337 | |
| 338 if (audcfg.resample == TRUE) | |
| 339 samplerate = audcfg.resample_rate; | |
| 340 else | |
| 341 samplerate = 44100; | |
| 342 | |
| 343 reader.open(filename); | |
| 344 reader.read(&header, sizeof(header)); | |
| 345 | |
| 346 nsf = new Nsf_Emu; | |
| 347 nsf->init(samplerate); | |
| 348 nsf->load(header, reader); | |
| 349 nsf->start_track(0); | |
| 350 | |
| 351 console_ip_is_going = TRUE; | |
| 352 | |
| 353 name = get_title(filename); | |
| 354 | |
| 355 if (audcfg.loop_length) | |
| 356 console_ip.set_info(name, audcfg.loop_length * 1000, | |
| 357 nsf->voice_count() * 1000, samplerate, 2); | |
| 358 else | |
| 359 console_ip.set_info(name, -1, nsf->voice_count() * 1000, | |
| 360 samplerate, 2); | |
| 361 | |
| 362 g_free(name); | |
| 363 | |
|
417
8ddd961ef0ff
[svn] Use FMT_S16_NE instead of unnecessary #ifdef WORDS_BIGENDIAN trickery.
chainsaw
parents:
371
diff
changeset
|
364 if (!console_ip.output->open_audio(FMT_S16_NE, samplerate, 2)) |
| 213 | 365 return; |
| 366 | |
| 367 playing_type = PLAY_TYPE_NSF; | |
| 368 | |
| 369 decode_thread = g_thread_create(play_loop_nsf, nsf, TRUE, NULL); | |
| 370 } | |
| 371 | |
| 214 | 372 static void play_file_gbs(char *filename) |
| 373 { | |
| 374 gchar *name; | |
|
479
0b9507985f0d
[svn] Use the VFS subsystem and delete the unused demo source.
chainsaw
parents:
477
diff
changeset
|
375 Gbs_Reader reader; |
| 214 | 376 Gbs_Emu::header_t header; |
| 377 gint samplerate; | |
| 378 | |
| 379 if (audcfg.resample == TRUE) | |
| 380 samplerate = audcfg.resample_rate; | |
| 381 else | |
| 382 samplerate = 44100; | |
| 383 | |
| 384 reader.open(filename); | |
| 385 reader.read(&header, sizeof(header)); | |
| 386 | |
| 387 gbs = new Gbs_Emu; | |
| 388 gbs->init(samplerate); | |
| 389 gbs->load(header, reader); | |
| 390 gbs->start_track(0); | |
| 391 | |
| 392 console_ip_is_going = TRUE; | |
| 393 | |
| 394 name = get_title(filename); | |
| 395 | |
| 396 if (audcfg.loop_length) | |
| 397 console_ip.set_info(name, audcfg.loop_length * 1000, | |
| 398 gbs->voice_count() * 1000, samplerate, 2); | |
| 399 else | |
| 334 | 400 console_ip.set_info(name, -1, gbs->voice_count() * 1000, |
| 214 | 401 samplerate, 2); |
| 402 | |
| 403 g_free(name); | |
| 404 | |
|
417
8ddd961ef0ff
[svn] Use FMT_S16_NE instead of unnecessary #ifdef WORDS_BIGENDIAN trickery.
chainsaw
parents:
371
diff
changeset
|
405 if (!console_ip.output->open_audio(FMT_S16_NE, samplerate, 2)) |
| 214 | 406 return; |
| 407 | |
| 408 playing_type = PLAY_TYPE_GBS; | |
| 409 | |
| 410 decode_thread = g_thread_create(play_loop_gbs, gbs, TRUE, NULL); | |
| 411 } | |
| 412 | |
| 334 | 413 static void play_file_gym(char *filename) |
| 414 { | |
| 415 gchar *name; | |
|
479
0b9507985f0d
[svn] Use the VFS subsystem and delete the unused demo source.
chainsaw
parents:
477
diff
changeset
|
416 Gym_Reader reader; |
| 334 | 417 Gym_Emu::header_t header; |
| 418 gint samplerate; | |
| 419 | |
| 420 if (audcfg.resample == TRUE) | |
| 421 samplerate = audcfg.resample_rate; | |
| 422 else | |
| 423 samplerate = 44100; | |
| 424 | |
| 425 reader.open(filename); | |
| 426 reader.read(&header, sizeof(header)); | |
| 427 | |
| 428 gym = new Gym_Emu; | |
| 429 gym->init(samplerate); | |
| 430 gym->load(header, reader); | |
| 431 gym->start_track(0); | |
| 432 | |
| 433 console_ip_is_going = TRUE; | |
| 434 | |
| 435 name = get_title(filename); | |
| 436 | |
| 362 | 437 if (gym->track_length() > 0) |
| 438 console_ip.set_info(name, gym->track_length() * 1000, | |
| 439 gym->voice_count() * 1000, samplerate, 2); | |
| 440 else if (audcfg.loop_length) | |
| 334 | 441 console_ip.set_info(name, audcfg.loop_length * 1000, |
| 442 gym->voice_count() * 1000, samplerate, 2); | |
| 443 else | |
| 444 console_ip.set_info(name, -1, gym->voice_count() * 1000, | |
| 445 samplerate, 2); | |
| 446 | |
| 447 g_free(name); | |
| 448 | |
|
417
8ddd961ef0ff
[svn] Use FMT_S16_NE instead of unnecessary #ifdef WORDS_BIGENDIAN trickery.
chainsaw
parents:
371
diff
changeset
|
449 if (!console_ip.output->open_audio(FMT_S16_NE, samplerate, 2)) |
| 334 | 450 return; |
| 451 | |
| 452 playing_type = PLAY_TYPE_GYM; | |
| 453 | |
| 454 decode_thread = g_thread_create(play_loop_gym, gym, TRUE, NULL); | |
| 455 } | |
| 456 | |
| 364 | 457 static void play_file_vgm(char *filename) |
| 458 { | |
| 459 gchar *name; | |
|
479
0b9507985f0d
[svn] Use the VFS subsystem and delete the unused demo source.
chainsaw
parents:
477
diff
changeset
|
460 Vgm_Reader reader; |
| 364 | 461 Vgm_Emu::header_t header; |
| 462 gint samplerate; | |
| 463 | |
| 464 if (audcfg.resample == TRUE) | |
| 465 samplerate = audcfg.resample_rate; | |
| 466 else | |
| 467 samplerate = 44100; | |
| 468 | |
| 469 reader.open(filename); | |
| 470 reader.read(&header, sizeof(header)); | |
| 471 | |
| 472 vgm = new Vgm_Emu; | |
| 473 vgm->init(samplerate); | |
| 474 vgm->load(header, reader); | |
| 475 vgm->start_track(0); | |
| 476 | |
| 477 console_ip_is_going = TRUE; | |
| 478 | |
| 479 name = get_title(filename); | |
| 480 | |
|
472
98ebf4727a64
[svn] Length detection for VGM; tag reading for GBS.
chainsaw
parents:
469
diff
changeset
|
481 if (vgm->track_length() > 0) |
|
98ebf4727a64
[svn] Length detection for VGM; tag reading for GBS.
chainsaw
parents:
469
diff
changeset
|
482 console_ip.set_info(name, vgm->track_length() * 1000, |
|
98ebf4727a64
[svn] Length detection for VGM; tag reading for GBS.
chainsaw
parents:
469
diff
changeset
|
483 vgm->voice_count() * 1000, samplerate, 2); |
|
98ebf4727a64
[svn] Length detection for VGM; tag reading for GBS.
chainsaw
parents:
469
diff
changeset
|
484 else if (audcfg.loop_length) |
| 364 | 485 console_ip.set_info(name, audcfg.loop_length * 1000, |
| 486 vgm->voice_count() * 1000, samplerate, 2); | |
| 487 else | |
| 488 console_ip.set_info(name, -1, vgm->voice_count() * 1000, | |
| 489 samplerate, 2); | |
| 490 | |
| 491 g_free(name); | |
| 492 | |
|
417
8ddd961ef0ff
[svn] Use FMT_S16_NE instead of unnecessary #ifdef WORDS_BIGENDIAN trickery.
chainsaw
parents:
371
diff
changeset
|
493 if (!console_ip.output->open_audio(FMT_S16_NE, samplerate, 2)) |
| 364 | 494 return; |
| 495 | |
| 496 playing_type = PLAY_TYPE_VGM; | |
| 497 | |
| 498 decode_thread = g_thread_create(play_loop_vgm, vgm, TRUE, NULL); | |
| 499 } | |
| 500 | |
|
147
6fe2bfbe6fc2
[svn] Move SPC-specific code into SPC-specific routines.
nenolod
parents:
146
diff
changeset
|
501 static void play_file(char *filename) |
|
6fe2bfbe6fc2
[svn] Move SPC-specific code into SPC-specific routines.
nenolod
parents:
146
diff
changeset
|
502 { |
| 213 | 503 switch (is_our_file(filename)) |
|
147
6fe2bfbe6fc2
[svn] Move SPC-specific code into SPC-specific routines.
nenolod
parents:
146
diff
changeset
|
504 { |
| 213 | 505 case PLAY_TYPE_SPC: |
|
147
6fe2bfbe6fc2
[svn] Move SPC-specific code into SPC-specific routines.
nenolod
parents:
146
diff
changeset
|
506 play_file_spc(filename); |
| 213 | 507 break; |
| 508 case PLAY_TYPE_NSF: | |
| 509 play_file_nsf(filename); | |
| 510 break; | |
| 214 | 511 case PLAY_TYPE_GBS: |
| 512 play_file_gbs(filename); | |
| 513 break; | |
| 334 | 514 case PLAY_TYPE_GYM: |
| 515 play_file_gym(filename); | |
| 516 break; | |
| 364 | 517 case PLAY_TYPE_VGM: |
| 518 play_file_vgm(filename); | |
| 519 break; | |
|
147
6fe2bfbe6fc2
[svn] Move SPC-specific code into SPC-specific routines.
nenolod
parents:
146
diff
changeset
|
520 } |
| 95 | 521 } |
| 522 | |
| 96 | 523 static void seek(gint time) |
| 524 { | |
| 525 // XXX: Not yet implemented | |
| 526 } | |
| 527 | |
| 528 InputPlugin console_ip = { | |
| 529 NULL, | |
| 530 NULL, | |
| 531 NULL, | |
| 532 console_init, | |
| 109 | 533 console_aboutbox, |
| 96 | 534 NULL, |
| 535 is_our_file, | |
| 536 NULL, | |
| 537 play_file, | |
| 538 console_stop, | |
| 539 console_pause, | |
| 540 seek, | |
| 541 NULL, | |
| 542 get_time, | |
| 543 NULL, | |
| 544 NULL, | |
| 545 NULL, | |
| 546 NULL, | |
| 547 NULL, | |
| 548 NULL, | |
| 549 NULL, | |
| 104 | 550 get_song_info, |
| 96 | 551 NULL, |
| 552 NULL | |
| 553 }; | |
| 554 | |
| 555 static void console_stop(void) | |
| 556 { | |
| 103 | 557 console_ip_is_going = FALSE; |
| 96 | 558 g_thread_join(decode_thread); |
| 559 console_ip.output->close_audio(); | |
| 560 } | |
| 561 | |
|
98
e42694a28331
[svn] More progress -- now loads as an audacious module. :)
nenolod
parents:
96
diff
changeset
|
562 extern "C" InputPlugin *get_iplugin_info(void) |
| 96 | 563 { |
| 109 | 564 console_ip.description = g_strdup_printf(_("SPC, GYM, NSF, VGM and GBS module decoder")); |
| 96 | 565 return &console_ip; |
| 566 } | |
| 567 | |
| 568 static void console_pause(gshort p) | |
| 569 { | |
| 570 console_ip.output->pause(p); | |
| 571 } | |
| 572 | |
|
147
6fe2bfbe6fc2
[svn] Move SPC-specific code into SPC-specific routines.
nenolod
parents:
146
diff
changeset
|
573 static void *play_loop_spc(gpointer arg) |
| 95 | 574 { |
| 213 | 575 g_static_mutex_lock(&playback_mutex); |
| 99 | 576 Spc_Emu *my_spc = (Spc_Emu *) arg; |
| 213 | 577 Music_Emu::sample_t buf[1024]; |
| 95 | 578 |
| 145 | 579 for (;;) |
| 580 { | |
| 581 if (!console_ip_is_going) | |
| 582 break; | |
| 583 | |
| 584 my_spc->play(1024, buf); | |
| 585 | |
|
477
8fc500c08b61
[svn] SPC length detection c/o Kiyoshi Aman <kiyoshi.aman -at- gmail.com>
nenolod
parents:
473
diff
changeset
|
586 if ((console_ip.output->output_time() / 1000) > |
|
8fc500c08b61
[svn] SPC length detection c/o Kiyoshi Aman <kiyoshi.aman -at- gmail.com>
nenolod
parents:
473
diff
changeset
|
587 spc->length && spc->length != 0) |
|
8fc500c08b61
[svn] SPC length detection c/o Kiyoshi Aman <kiyoshi.aman -at- gmail.com>
nenolod
parents:
473
diff
changeset
|
588 break; |
| 145 | 589 if ((console_ip.output->output_time() / 1000) > |
| 590 audcfg.loop_length && audcfg.loop_length != 0) | |
| 591 break; | |
| 349 | 592 produce_audio(console_ip.output->written_time(), |
|
417
8ddd961ef0ff
[svn] Use FMT_S16_NE instead of unnecessary #ifdef WORDS_BIGENDIAN trickery.
chainsaw
parents:
371
diff
changeset
|
593 FMT_S16_NE, 1, 2048, buf, NULL); |
| 108 | 594 while(console_ip.output->buffer_free() < 2048) |
|
101
59ba6595fdf1
[svn] More accurate sound reproduction, but there is warbling. Still locks up player on completion.
nenolod
parents:
100
diff
changeset
|
595 xmms_usleep(10000); |
| 100 | 596 } |
| 95 | 597 |
| 96 | 598 delete spc; |
| 145 | 599 console_ip.output->close_audio(); |
| 600 console_ip_is_going = FALSE; | |
|
147
6fe2bfbe6fc2
[svn] Move SPC-specific code into SPC-specific routines.
nenolod
parents:
146
diff
changeset
|
601 playing_type = PLAY_TYPE_NONE; |
| 213 | 602 g_static_mutex_unlock(&playback_mutex); |
| 603 g_thread_exit(NULL); | |
| 604 | |
| 605 return NULL; | |
| 606 } | |
| 607 | |
| 608 static void *play_loop_nsf(gpointer arg) | |
| 609 { | |
| 610 g_static_mutex_lock(&playback_mutex); | |
| 611 Nsf_Emu *my_nsf = (Nsf_Emu *) arg; | |
| 612 Music_Emu::sample_t buf[1024]; | |
| 613 | |
| 614 for (;;) | |
| 615 { | |
| 616 if (!console_ip_is_going) | |
| 617 break; | |
| 618 | |
| 619 my_nsf->play(1024, buf); | |
| 620 | |
| 621 if ((console_ip.output->output_time() / 1000) > | |
| 622 audcfg.loop_length && audcfg.loop_length != 0) | |
| 623 break; | |
| 349 | 624 produce_audio(console_ip.output->written_time(), |
|
417
8ddd961ef0ff
[svn] Use FMT_S16_NE instead of unnecessary #ifdef WORDS_BIGENDIAN trickery.
chainsaw
parents:
371
diff
changeset
|
625 FMT_S16_NE, 1, 2048, buf, NULL); |
| 213 | 626 while(console_ip.output->buffer_free() < 2048) |
| 627 xmms_usleep(10000); | |
| 628 } | |
| 629 | |
| 630 delete nsf; | |
| 631 console_ip.output->close_audio(); | |
| 632 console_ip_is_going = FALSE; | |
| 633 playing_type = PLAY_TYPE_NONE; | |
| 634 g_static_mutex_unlock(&playback_mutex); | |
| 96 | 635 g_thread_exit(NULL); |
| 95 | 636 |
| 96 | 637 return NULL; |
| 95 | 638 } |
| 639 | |
| 214 | 640 static void *play_loop_gbs(gpointer arg) |
| 641 { | |
| 642 g_static_mutex_lock(&playback_mutex); | |
| 643 Gbs_Emu *my_gbs = (Gbs_Emu *) arg; | |
| 644 Music_Emu::sample_t buf[1024]; | |
| 645 | |
| 646 for (;;) | |
| 647 { | |
| 648 if (!console_ip_is_going) | |
| 649 break; | |
| 650 | |
| 651 my_gbs->play(1024, buf); | |
| 652 | |
| 653 if ((console_ip.output->output_time() / 1000) > | |
| 654 audcfg.loop_length && audcfg.loop_length != 0) | |
| 655 break; | |
| 349 | 656 produce_audio(console_ip.output->written_time(), |
|
417
8ddd961ef0ff
[svn] Use FMT_S16_NE instead of unnecessary #ifdef WORDS_BIGENDIAN trickery.
chainsaw
parents:
371
diff
changeset
|
657 FMT_S16_NE, 1, 2048, buf, NULL); |
| 214 | 658 while(console_ip.output->buffer_free() < 2048) |
| 659 xmms_usleep(10000); | |
| 660 } | |
| 661 | |
| 662 delete gbs; | |
| 663 console_ip.output->close_audio(); | |
| 664 console_ip_is_going = FALSE; | |
| 665 playing_type = PLAY_TYPE_NONE; | |
| 666 g_static_mutex_unlock(&playback_mutex); | |
| 667 g_thread_exit(NULL); | |
| 668 | |
| 669 return NULL; | |
| 670 } | |
| 671 | |
| 334 | 672 static void *play_loop_gym(gpointer arg) |
| 673 { | |
| 674 g_static_mutex_lock(&playback_mutex); | |
| 675 Gym_Emu *my_gym = (Gym_Emu *) arg; | |
| 676 Music_Emu::sample_t buf[1024]; | |
| 677 | |
| 678 for (;;) | |
| 679 { | |
| 680 if (!console_ip_is_going) | |
| 681 break; | |
| 682 | |
| 683 my_gym->play(1024, buf); | |
| 684 | |
| 685 if ((console_ip.output->output_time() / 1000) > | |
|
371
e296500f595a
[svn] Stop GYM playback at the right time, if the length is known.
chainsaw
parents:
366
diff
changeset
|
686 gym->track_length() && gym->track_length() != 0) |
|
e296500f595a
[svn] Stop GYM playback at the right time, if the length is known.
chainsaw
parents:
366
diff
changeset
|
687 break; |
|
e296500f595a
[svn] Stop GYM playback at the right time, if the length is known.
chainsaw
parents:
366
diff
changeset
|
688 if ((console_ip.output->output_time() / 1000) > |
| 334 | 689 audcfg.loop_length && audcfg.loop_length != 0) |
| 690 break; | |
| 349 | 691 produce_audio(console_ip.output->written_time(), |
|
417
8ddd961ef0ff
[svn] Use FMT_S16_NE instead of unnecessary #ifdef WORDS_BIGENDIAN trickery.
chainsaw
parents:
371
diff
changeset
|
692 FMT_S16_NE, 1, 2048, buf, NULL); |
| 334 | 693 while(console_ip.output->buffer_free() < 2048) |
| 694 xmms_usleep(10000); | |
| 695 } | |
| 696 | |
| 697 delete gym; | |
| 698 console_ip.output->close_audio(); | |
| 699 console_ip_is_going = FALSE; | |
| 700 playing_type = PLAY_TYPE_NONE; | |
| 701 g_static_mutex_unlock(&playback_mutex); | |
| 702 g_thread_exit(NULL); | |
| 703 | |
| 704 return NULL; | |
| 705 } | |
| 706 | |
| 364 | 707 static void *play_loop_vgm(gpointer arg) |
| 708 { | |
| 709 g_static_mutex_lock(&playback_mutex); | |
| 710 Vgm_Emu *my_vgm = (Vgm_Emu *) arg; | |
| 711 Music_Emu::sample_t buf[1024]; | |
| 712 | |
| 713 for (;;) | |
| 714 { | |
| 715 if (!console_ip_is_going) | |
| 716 break; | |
| 717 | |
| 718 my_vgm->play(1024, buf); | |
| 719 | |
| 720 if ((console_ip.output->output_time() / 1000) > | |
|
472
98ebf4727a64
[svn] Length detection for VGM; tag reading for GBS.
chainsaw
parents:
469
diff
changeset
|
721 vgm->track_length() && vgm->track_length() != 0) |
|
98ebf4727a64
[svn] Length detection for VGM; tag reading for GBS.
chainsaw
parents:
469
diff
changeset
|
722 break; |
|
98ebf4727a64
[svn] Length detection for VGM; tag reading for GBS.
chainsaw
parents:
469
diff
changeset
|
723 if ((console_ip.output->output_time() / 1000) > |
| 364 | 724 audcfg.loop_length && audcfg.loop_length != 0) |
| 725 break; | |
| 726 produce_audio(console_ip.output->written_time(), | |
|
417
8ddd961ef0ff
[svn] Use FMT_S16_NE instead of unnecessary #ifdef WORDS_BIGENDIAN trickery.
chainsaw
parents:
371
diff
changeset
|
727 FMT_S16_NE, 1, 2048, buf, NULL); |
| 364 | 728 while(console_ip.output->buffer_free() < 2048) |
| 729 xmms_usleep(10000); | |
| 730 } | |
| 731 | |
| 732 delete vgm; | |
| 733 console_ip.output->close_audio(); | |
| 734 console_ip_is_going = FALSE; | |
| 735 playing_type = PLAY_TYPE_NONE; | |
| 736 g_static_mutex_unlock(&playback_mutex); | |
| 737 g_thread_exit(NULL); | |
| 738 | |
| 739 return NULL; | |
| 740 } | |
| 741 | |
| 96 | 742 static int get_time(void) |
| 743 { | |
| 145 | 744 if (console_ip_is_going == TRUE) |
| 745 return console_ip.output->output_time(); | |
| 746 else | |
| 747 return -1; | |
| 96 | 748 } |
| 95 | 749 |
| 100 | 750 static void console_init(void) |
| 751 { | |
|
319
1e642d74d68c
[svn] Do not abort if libmpc is not found, just disable musepack plugin.
chainsaw
parents:
288
diff
changeset
|
752 ConfigDb *db; |
| 100 | 753 |
|
319
1e642d74d68c
[svn] Do not abort if libmpc is not found, just disable musepack plugin.
chainsaw
parents:
288
diff
changeset
|
754 db = bmp_cfg_db_open(); |
|
150
1997ecd9dcb1
[svn] Add ability to override defaults via .audacious/config until we can get a GUI.
nenolod
parents:
149
diff
changeset
|
755 |
|
319
1e642d74d68c
[svn] Do not abort if libmpc is not found, just disable musepack plugin.
chainsaw
parents:
288
diff
changeset
|
756 bmp_cfg_db_get_int(db, "console", "loop_length", &audcfg.loop_length); |
|
1e642d74d68c
[svn] Do not abort if libmpc is not found, just disable musepack plugin.
chainsaw
parents:
288
diff
changeset
|
757 bmp_cfg_db_get_bool(db, "console", "resample", &audcfg.resample); |
|
1e642d74d68c
[svn] Do not abort if libmpc is not found, just disable musepack plugin.
chainsaw
parents:
288
diff
changeset
|
758 bmp_cfg_db_get_int(db, "console", "resample_rate", &audcfg.resample_rate); |
|
150
1997ecd9dcb1
[svn] Add ability to override defaults via .audacious/config until we can get a GUI.
nenolod
parents:
149
diff
changeset
|
759 |
|
319
1e642d74d68c
[svn] Do not abort if libmpc is not found, just disable musepack plugin.
chainsaw
parents:
288
diff
changeset
|
760 bmp_cfg_db_close(db); |
| 100 | 761 } |
| 762 | |
| 109 | 763 extern "C" void console_aboutbox(void) |
| 764 { | |
| 765 xmms_show_message(_("About the Console Music Decoder"), | |
| 766 _("Console music decoder engine based on Game_Music_Emu 0.2.4.\n" | |
| 767 "Audacious implementation by: William Pitcock <nenolod@nenolod.net>"), | |
| 768 _("Ok"), | |
| 769 FALSE, NULL, NULL); | |
| 770 } |
