Mercurial > audlegacy-plugins
comparison src/ffmpeg/ffmpeg.c @ 836:7efd0747b362 trunk
[svn] - namespace changes
| author | nenolod |
|---|---|
| date | Mon, 12 Mar 2007 16:02:59 -0700 |
| parents | 485ba2ba5976 |
| children | 8561bcf928a3 |
comparison
equal
deleted
inserted
replaced
| 835:485ba2ba5976 | 836:7efd0747b362 |
|---|---|
| 61 See the GNU General Public License for more details.\n" | 61 See the GNU General Public License for more details.\n" |
| 62 #define PLUGIN_NAME "Audacious-WMA" | 62 #define PLUGIN_NAME "Audacious-WMA" |
| 63 #define PLUGIN_VERSION "v.1.0.5" | 63 #define PLUGIN_VERSION "v.1.0.5" |
| 64 #define ST_BUFF 1024 | 64 #define ST_BUFF 1024 |
| 65 | 65 |
| 66 static int wma_decode = 0; | 66 static int ffmpeg_decode = 0; |
| 67 static gboolean wma_pause = 0; | 67 static gboolean ffmpeg_pause = 0; |
| 68 static int wma_seekpos = -1; | 68 static int ffmpeg_seekpos = -1; |
| 69 static int wma_st_buff, wma_idx, wma_idx2; | 69 static int ffmpeg_st_buff, ffmpeg_idx, ffmpeg_idx2; |
| 70 static GThread *wma_decode_thread; | 70 static GThread *ffmpeg_decode_thread; |
| 71 GStaticMutex wma_mutex = G_STATIC_MUTEX_INIT; | 71 GStaticMutex ffmpeg_mutex = G_STATIC_MUTEX_INIT; |
| 72 static AVCodecContext *c = NULL; | 72 static AVCodecContext *c = NULL; |
| 73 static AVFormatContext *ic = NULL; | 73 static AVFormatContext *ic = NULL; |
| 74 static AVCodecContext *c2 = NULL; | 74 static AVCodecContext *c2 = NULL; |
| 75 static AVFormatContext *ic2 = NULL; | 75 static AVFormatContext *ic2 = NULL; |
| 76 static uint8_t *wma_outbuf, *wma_s_outbuf; | 76 static uint8_t *ffmpeg_outbuf, *ffmpeg_s_outbuf; |
| 77 | 77 |
| 78 char description[64]; | 78 char description[64]; |
| 79 static void wma_about(void); | 79 static void ffmpeg_about(void); |
| 80 static void wma_init(void); | 80 static void ffmpeg_init(void); |
| 81 static int wma_is_our_file(char *filename); | 81 static int ffmpeg_is_our_file(char *filename); |
| 82 static int wma_is_our_fd(char *filename, VFSFile *fd); | 82 static int ffmpeg_is_our_fd(char *filename, VFSFile *fd); |
| 83 static void wma_play_file(InputPlayback *data); | 83 static void ffmpeg_play_file(InputPlayback *data); |
| 84 static void wma_stop(InputPlayback *data); | 84 static void ffmpeg_stop(InputPlayback *data); |
| 85 static void wma_seek(InputPlayback *data, int time); | 85 static void ffmpeg_seek(InputPlayback *data, int time); |
| 86 static void wma_do_pause(InputPlayback *data, short p); | 86 static void ffmpeg_do_pause(InputPlayback *data, short p); |
| 87 static int wma_get_time(InputPlayback *data); | 87 static int ffmpeg_get_time(InputPlayback *data); |
| 88 static void wma_get_song_info(char *filename, char **title, int *length); | 88 static void ffmpeg_get_song_info(char *filename, char **title, int *length); |
| 89 static TitleInput *wma_get_song_tuple(char *filename); | 89 static TitleInput *ffmpeg_get_song_tuple(char *filename); |
| 90 static char *wsong_title; | 90 static char *wsong_title; |
| 91 static int wsong_time; | 91 static int wsong_time; |
| 92 | 92 |
| 93 static GtkWidget *dialog1, *button1, *label1; | 93 static GtkWidget *dialog1, *button1, *label1; |
| 94 | 94 |
| 95 InputPlugin *get_iplugin_info(void); | 95 InputPlugin *get_iplugin_info(void); |
| 96 | 96 |
| 97 gchar *wma_fmts[] = { "wma", NULL }; | 97 gchar *ffmpeg_fmts[] = { "wma", NULL }; |
| 98 | 98 |
| 99 InputPlugin wma_ip = | 99 InputPlugin ffmpeg_ip = |
| 100 { | 100 { |
| 101 NULL, // Filled in by xmms | 101 NULL, // Filled in by xmms |
| 102 NULL, // Filled in by xmms | 102 NULL, // Filled in by xmms |
| 103 description, // The description that is shown in the preferences box | 103 description, // The description that is shown in the preferences box |
| 104 wma_init, // Called when the plugin is loaded | 104 ffmpeg_init, // Called when the plugin is loaded |
| 105 wma_about, // Show the about box | 105 ffmpeg_about, // Show the about box |
| 106 NULL, // Show the configure box | 106 NULL, // Show the configure box |
| 107 wma_is_our_file, // Return 1 if the plugin can handle the file | 107 ffmpeg_is_our_file, // Return 1 if the plugin can handle the file |
| 108 NULL, // Scan dir | 108 NULL, // Scan dir |
| 109 wma_play_file, // Play file | 109 ffmpeg_play_file, // Play file |
| 110 wma_stop, // Stop | 110 ffmpeg_stop, // Stop |
| 111 wma_do_pause, // Pause | 111 ffmpeg_do_pause, // Pause |
| 112 wma_seek, // Seek | 112 ffmpeg_seek, // Seek |
| 113 NULL, // Set the equalizer, most plugins won't be able to do this | 113 NULL, // Set the equalizer, most plugins won't be able to do this |
| 114 wma_get_time, // Get the time, usually returns the output plugins output time | 114 ffmpeg_get_time, // Get the time, usually returns the output plugins output time |
| 115 NULL, // Get volume | 115 NULL, // Get volume |
| 116 NULL, // Set volume | 116 NULL, // Set volume |
| 117 NULL, // OBSOLETE! | 117 NULL, // OBSOLETE! |
| 118 NULL, // OBSOLETE! | 118 NULL, // OBSOLETE! |
| 119 NULL, // Send data to the visualization plugins | 119 NULL, // Send data to the visualization plugins |
| 120 NULL, // Fill in the stuff that is shown in the player window | 120 NULL, // Fill in the stuff that is shown in the player window |
| 121 NULL, // Show some text in the song title box. Filled in by xmms | 121 NULL, // Show some text in the song title box. Filled in by xmms |
| 122 wma_get_song_info, // Function to grab the title string | 122 ffmpeg_get_song_info, // Function to grab the title string |
| 123 NULL, // Bring up an info window for the filename passed in | 123 NULL, // Bring up an info window for the filename passed in |
| 124 NULL, // Handle to the current output plugin. Filled in by xmms | 124 NULL, // Handle to the current output plugin. Filled in by xmms |
| 125 wma_get_song_tuple, // Tuple builder | 125 ffmpeg_get_song_tuple, // Tuple builder |
| 126 NULL, | 126 NULL, |
| 127 NULL, | 127 NULL, |
| 128 wma_is_our_fd, // vfs | 128 ffmpeg_is_our_fd, // vfs |
| 129 wma_fmts | 129 ffmpeg_fmts |
| 130 }; | 130 }; |
| 131 | 131 |
| 132 InputPlugin *get_iplugin_info(void) | 132 InputPlugin *get_iplugin_info(void) |
| 133 { | 133 { |
| 134 memset(description, 0, 64); | 134 memset(description, 0, 64); |
| 135 wma_ip.description = g_strdup_printf(_("WMA Player %s"), PACKAGE_VERSION); | 135 ffmpeg_ip.description = g_strdup_printf(_("WMA Player %s"), PACKAGE_VERSION); |
| 136 return &wma_ip; | 136 return &ffmpeg_ip; |
| 137 } | 137 } |
| 138 | 138 |
| 139 static gchar *str_twenty_to_space(gchar * str) | 139 static gchar *str_twenty_to_space(gchar * str) |
| 140 { | 140 { |
| 141 gchar *match, *match_end; | 141 gchar *match, *match_end; |
| 151 } | 151 } |
| 152 | 152 |
| 153 return str; | 153 return str; |
| 154 } | 154 } |
| 155 | 155 |
| 156 static void wma_about(void) | 156 static void ffmpeg_about(void) |
| 157 { | 157 { |
| 158 char *title; | 158 char *title; |
| 159 char *message; | 159 char *message; |
| 160 | 160 |
| 161 if (dialog1) return; | 161 if (dialog1) return; |
| 190 gtk_widget_grab_focus(button1); | 190 gtk_widget_grab_focus(button1); |
| 191 g_free(title); | 191 g_free(title); |
| 192 g_free(message); | 192 g_free(message); |
| 193 } | 193 } |
| 194 | 194 |
| 195 static void wma_init(void) | 195 static void ffmpeg_init(void) |
| 196 { | 196 { |
| 197 avcodec_init(); | 197 avcodec_init(); |
| 198 avcodec_register_all(); | 198 avcodec_register_all(); |
| 199 av_register_all(); | 199 av_register_all(); |
| 200 } | 200 } |
| 201 | 201 |
| 202 static int wma_is_our_file(char *filename) | 202 static int ffmpeg_is_our_file(char *filename) |
| 203 { | 203 { |
| 204 AVCodec *codec2; | 204 AVCodec *codec2; |
| 205 | 205 |
| 206 if(av_open_input_file(&ic2, str_twenty_to_space(filename), NULL, 0, NULL) < 0) return 0; | 206 if(av_open_input_file(&ic2, str_twenty_to_space(filename), NULL, 0, NULL) < 0) return 0; |
| 207 | 207 |
| 208 for(wma_idx2 = 0; wma_idx2 < ic2->nb_streams; wma_idx2++) { | 208 for(ffmpeg_idx2 = 0; ffmpeg_idx2 < ic2->nb_streams; ffmpeg_idx2++) { |
| 209 c2 = ic2->streams[wma_idx2]->codec; | 209 c2 = ic2->streams[ffmpeg_idx2]->codec; |
| 210 if(c2->codec_type == CODEC_TYPE_AUDIO) break; | 210 if(c2->codec_type == CODEC_TYPE_AUDIO) break; |
| 211 } | 211 } |
| 212 | 212 |
| 213 av_find_stream_info(ic2); | 213 av_find_stream_info(ic2); |
| 214 | 214 |
| 221 | 221 |
| 222 av_close_input_file(ic2); | 222 av_close_input_file(ic2); |
| 223 return 1; | 223 return 1; |
| 224 } | 224 } |
| 225 | 225 |
| 226 static int wma_is_our_fd(char *filename, VFSFile *fd) | 226 static int ffmpeg_is_our_fd(char *filename, VFSFile *fd) |
| 227 { | 227 { |
| 228 AVCodec *codec2; | 228 AVCodec *codec2; |
| 229 | 229 |
| 230 if(av_open_input_vfsfile(&ic2, filename, fd, NULL, 0, NULL) < 0) return 0; | 230 if(av_open_input_vfsfile(&ic2, filename, fd, NULL, 0, NULL) < 0) return 0; |
| 231 | 231 |
| 232 for(wma_idx2 = 0; wma_idx2 < ic2->nb_streams; wma_idx2++) { | 232 for(ffmpeg_idx2 = 0; ffmpeg_idx2 < ic2->nb_streams; ffmpeg_idx2++) { |
| 233 c2 = ic2->streams[wma_idx2]->codec; | 233 c2 = ic2->streams[ffmpeg_idx2]->codec; |
| 234 if(c2->codec_type == CODEC_TYPE_AUDIO) break; | 234 if(c2->codec_type == CODEC_TYPE_AUDIO) break; |
| 235 } | 235 } |
| 236 | 236 |
| 237 av_find_stream_info(ic2); | 237 av_find_stream_info(ic2); |
| 238 | 238 |
| 239 codec2 = avcodec_find_decoder(c2->codec_id); | 239 codec2 = avcodec_find_decoder(c2->codec_id); |
| 240 | 240 |
| 241 return 1; | 241 return 1; |
| 242 } | 242 } |
| 243 | 243 |
| 244 static void wma_do_pause(InputPlayback *playback, short p) | 244 static void ffmpeg_do_pause(InputPlayback *playback, short p) |
| 245 { | 245 { |
| 246 wma_pause = p; | 246 ffmpeg_pause = p; |
| 247 playback->output->pause(wma_pause); | 247 playback->output->pause(ffmpeg_pause); |
| 248 } | 248 } |
| 249 | 249 |
| 250 static void wma_seek(InputPlayback *playback, int time) | 250 static void ffmpeg_seek(InputPlayback *playback, int time) |
| 251 { | 251 { |
| 252 wma_seekpos = time; | 252 ffmpeg_seekpos = time; |
| 253 if(wma_pause) playback->output->pause(0); | 253 if(ffmpeg_pause) playback->output->pause(0); |
| 254 while(wma_decode && wma_seekpos!=-1) xmms_usleep(10000); | 254 while(ffmpeg_decode && ffmpeg_seekpos!=-1) xmms_usleep(10000); |
| 255 if(wma_pause) playback->output->pause(1); | 255 if(ffmpeg_pause) playback->output->pause(1); |
| 256 } | 256 } |
| 257 | 257 |
| 258 static int wma_get_time(InputPlayback *playback) | 258 static int ffmpeg_get_time(InputPlayback *playback) |
| 259 { | 259 { |
| 260 playback->output->buffer_free(); | 260 playback->output->buffer_free(); |
| 261 if(wma_decode) return playback->output->output_time(); | 261 if(ffmpeg_decode) return playback->output->output_time(); |
| 262 return -1; | 262 return -1; |
| 263 } | 263 } |
| 264 | 264 |
| 265 static gchar *extname(const char *filename) | 265 static gchar *extname(const char *filename) |
| 266 { | 266 { |
| 273 { | 273 { |
| 274 if(str && strlen(str) > 0) return g_strdup(str); | 274 if(str && strlen(str) > 0) return g_strdup(str); |
| 275 return NULL; | 275 return NULL; |
| 276 } | 276 } |
| 277 | 277 |
| 278 static TitleInput *wma_get_song_tuple(gchar * filename) | 278 static TitleInput *ffmpeg_get_song_tuple(gchar * filename) |
| 279 { | 279 { |
| 280 TitleInput *tuple = NULL; | 280 TitleInput *tuple = NULL; |
| 281 AVFormatContext *in = NULL; | 281 AVFormatContext *in = NULL; |
| 282 gchar *filename_proxy = g_strdup(filename); | 282 gchar *filename_proxy = g_strdup(filename); |
| 283 | 283 |
| 351 return in->duration/1000; | 351 return in->duration/1000; |
| 352 else | 352 else |
| 353 return 0; | 353 return 0; |
| 354 } | 354 } |
| 355 | 355 |
| 356 static void wma_get_song_info(char *filename, char **title_real, int *len_real) | 356 static void ffmpeg_get_song_info(char *filename, char **title_real, int *len_real) |
| 357 { | 357 { |
| 358 TitleInput *tuple = wma_get_song_tuple(filename); | 358 TitleInput *tuple = ffmpeg_get_song_tuple(filename); |
| 359 | 359 |
| 360 if (tuple == NULL) | 360 if (tuple == NULL) |
| 361 return; | 361 return; |
| 362 | 362 |
| 363 (*len_real) = tuple->length; | 363 (*len_real) = tuple->length; |
| 364 (*title_real) = xmms_get_titlestring(xmms_get_gentitle_format(), tuple); | 364 (*title_real) = xmms_get_titlestring(xmms_get_gentitle_format(), tuple); |
| 365 } | 365 } |
| 366 | 366 |
| 367 static void wma_playbuff(InputPlayback *playback, int out_size) | 367 static void ffmpeg_playbuff(InputPlayback *playback, int out_size) |
| 368 { | 368 { |
| 369 AVFifoBuffer f; | 369 AVFifoBuffer f; |
| 370 int sst_buff; | 370 int sst_buff; |
| 371 | 371 |
| 372 av_fifo_init(&f, out_size*2); | 372 av_fifo_init(&f, out_size*2); |
| 373 av_fifo_write(&f, wma_outbuf, out_size); | 373 av_fifo_write(&f, ffmpeg_outbuf, out_size); |
| 374 while(!av_fifo_read(&f, wma_s_outbuf, wma_st_buff) && wma_decode) | 374 while(!av_fifo_read(&f, ffmpeg_s_outbuf, ffmpeg_st_buff) && ffmpeg_decode) |
| 375 { | 375 { |
| 376 sst_buff = wma_st_buff; | 376 sst_buff = ffmpeg_st_buff; |
| 377 if(wma_pause) memset(wma_s_outbuf, 0, sst_buff); | 377 if(ffmpeg_pause) memset(ffmpeg_s_outbuf, 0, sst_buff); |
| 378 while(playback->output->buffer_free() < wma_st_buff) xmms_usleep(20000); | 378 while(playback->output->buffer_free() < ffmpeg_st_buff) xmms_usleep(20000); |
| 379 produce_audio(playback->output->written_time(), FMT_S16_NE, | 379 produce_audio(playback->output->written_time(), FMT_S16_NE, |
| 380 c->channels, sst_buff, (short *)wma_s_outbuf, NULL); | 380 c->channels, sst_buff, (short *)ffmpeg_s_outbuf, NULL); |
| 381 memset(wma_s_outbuf, 0, sst_buff); | 381 memset(ffmpeg_s_outbuf, 0, sst_buff); |
| 382 } | 382 } |
| 383 av_fifo_free(&f); | 383 av_fifo_free(&f); |
| 384 return; | 384 return; |
| 385 } | 385 } |
| 386 | 386 |
| 387 static void *wma_play_loop(void *arg) | 387 static void *ffmpeg_play_loop(void *arg) |
| 388 { | 388 { |
| 389 InputPlayback *playback = arg; | 389 InputPlayback *playback = arg; |
| 390 uint8_t *inbuf_ptr; | 390 uint8_t *inbuf_ptr; |
| 391 int out_size, size, len; | 391 int out_size, size, len; |
| 392 AVPacket pkt; | 392 AVPacket pkt; |
| 393 | 393 |
| 394 g_static_mutex_lock(&wma_mutex); | 394 g_static_mutex_lock(&ffmpeg_mutex); |
| 395 while(wma_decode){ | 395 while(ffmpeg_decode){ |
| 396 | 396 |
| 397 if(wma_seekpos != -1) | 397 if(ffmpeg_seekpos != -1) |
| 398 { | 398 { |
| 399 av_seek_frame(ic, wma_idx, wma_seekpos * 1000000LL, 0); | 399 av_seek_frame(ic, ffmpeg_idx, ffmpeg_seekpos * 1000000LL, 0); |
| 400 playback->output->flush(wma_seekpos * 1000); | 400 playback->output->flush(ffmpeg_seekpos * 1000); |
| 401 wma_seekpos = -1; | 401 ffmpeg_seekpos = -1; |
| 402 } | 402 } |
| 403 | 403 |
| 404 if(av_read_frame(ic, &pkt) < 0) break; | 404 if(av_read_frame(ic, &pkt) < 0) break; |
| 405 | 405 |
| 406 size = pkt.size; | 406 size = pkt.size; |
| 407 inbuf_ptr = pkt.data; | 407 inbuf_ptr = pkt.data; |
| 408 | 408 |
| 409 if(size == 0) break; | 409 if(size == 0) break; |
| 410 | 410 |
| 411 while(size > 0){ | 411 while(size > 0){ |
| 412 len = avcodec_decode_audio(c, (short *)wma_outbuf, &out_size, | 412 len = avcodec_decode_audio(c, (short *)ffmpeg_outbuf, &out_size, |
| 413 inbuf_ptr, size); | 413 inbuf_ptr, size); |
| 414 if(len < 0) break; | 414 if(len < 0) break; |
| 415 | 415 |
| 416 if(out_size <= 0) continue; | 416 if(out_size <= 0) continue; |
| 417 | 417 |
| 418 wma_playbuff(playback, out_size); | 418 ffmpeg_playbuff(playback, out_size); |
| 419 | 419 |
| 420 size -= len; | 420 size -= len; |
| 421 inbuf_ptr += len; | 421 inbuf_ptr += len; |
| 422 if(pkt.data) av_free_packet(&pkt); | 422 if(pkt.data) av_free_packet(&pkt); |
| 423 } | 423 } |
| 424 } | 424 } |
| 425 while(wma_decode && playback->output->buffer_playing()) xmms_usleep(30000); | 425 while(ffmpeg_decode && playback->output->buffer_playing()) xmms_usleep(30000); |
| 426 wma_decode = 0; | 426 ffmpeg_decode = 0; |
| 427 if(wma_s_outbuf) g_free(wma_s_outbuf); | 427 if(ffmpeg_s_outbuf) g_free(ffmpeg_s_outbuf); |
| 428 if(wma_outbuf) g_free(wma_outbuf); | 428 if(ffmpeg_outbuf) g_free(ffmpeg_outbuf); |
| 429 if(pkt.data) av_free_packet(&pkt); | 429 if(pkt.data) av_free_packet(&pkt); |
| 430 if(c) avcodec_close(c); | 430 if(c) avcodec_close(c); |
| 431 if(ic) av_close_input_file(ic); | 431 if(ic) av_close_input_file(ic); |
| 432 g_static_mutex_unlock(&wma_mutex); | 432 g_static_mutex_unlock(&ffmpeg_mutex); |
| 433 g_thread_exit(NULL); | 433 g_thread_exit(NULL); |
| 434 return(NULL); | 434 return(NULL); |
| 435 } | 435 } |
| 436 | 436 |
| 437 static void wma_play_file(InputPlayback *playback) | 437 static void ffmpeg_play_file(InputPlayback *playback) |
| 438 { | 438 { |
| 439 char *filename = playback->filename; | 439 char *filename = playback->filename; |
| 440 AVCodec *codec; | 440 AVCodec *codec; |
| 441 | 441 |
| 442 if(av_open_input_file(&ic, str_twenty_to_space(filename), NULL, 0, NULL) < 0) return; | 442 if(av_open_input_file(&ic, str_twenty_to_space(filename), NULL, 0, NULL) < 0) return; |
| 443 | 443 |
| 444 for(wma_idx = 0; wma_idx < ic->nb_streams; wma_idx++) { | 444 for(ffmpeg_idx = 0; ffmpeg_idx < ic->nb_streams; ffmpeg_idx++) { |
| 445 c = ic->streams[wma_idx]->codec; | 445 c = ic->streams[ffmpeg_idx]->codec; |
| 446 if(c->codec_type == CODEC_TYPE_AUDIO) break; | 446 if(c->codec_type == CODEC_TYPE_AUDIO) break; |
| 447 } | 447 } |
| 448 | 448 |
| 449 av_find_stream_info(ic); | 449 av_find_stream_info(ic); |
| 450 | 450 |
| 457 wsong_title = get_song_title(ic, filename); | 457 wsong_title = get_song_title(ic, filename); |
| 458 wsong_time = get_song_time(ic); | 458 wsong_time = get_song_time(ic); |
| 459 | 459 |
| 460 if(playback->output->open_audio(FMT_S16_NE, c->sample_rate, c->channels) <= 0) return; | 460 if(playback->output->open_audio(FMT_S16_NE, c->sample_rate, c->channels) <= 0) return; |
| 461 | 461 |
| 462 wma_st_buff = ST_BUFF; | 462 ffmpeg_st_buff = ST_BUFF; |
| 463 | 463 |
| 464 wma_ip.set_info(wsong_title, wsong_time, c->bit_rate, c->sample_rate, c->channels); | 464 ffmpeg_ip.set_info(wsong_title, wsong_time, c->bit_rate, c->sample_rate, c->channels); |
| 465 | 465 |
| 466 /* av_malloc() will wrap posix_memalign() if necessary -nenolod */ | 466 /* av_malloc() will wrap posix_memalign() if necessary -nenolod */ |
| 467 wma_s_outbuf = av_malloc(wma_st_buff); | 467 ffmpeg_s_outbuf = av_malloc(ffmpeg_st_buff); |
| 468 wma_outbuf = av_malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE); | 468 ffmpeg_outbuf = av_malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE); |
| 469 | 469 |
| 470 wma_seekpos = -1; | 470 ffmpeg_seekpos = -1; |
| 471 wma_decode = 1; | 471 ffmpeg_decode = 1; |
| 472 wma_decode_thread = g_thread_create((GThreadFunc)wma_play_loop, playback, TRUE, NULL); | 472 ffmpeg_decode_thread = g_thread_create((GThreadFunc)ffmpeg_play_loop, playback, TRUE, NULL); |
| 473 } | 473 } |
| 474 | 474 |
| 475 static void wma_stop(InputPlayback *playback) | 475 static void ffmpeg_stop(InputPlayback *playback) |
| 476 { | 476 { |
| 477 wma_decode = 0; | 477 ffmpeg_decode = 0; |
| 478 if(wma_pause) wma_do_pause(playback, 0); | 478 if(ffmpeg_pause) ffmpeg_do_pause(playback, 0); |
| 479 g_thread_join(wma_decode_thread); | 479 g_thread_join(ffmpeg_decode_thread); |
| 480 playback->output->close_audio(); | 480 playback->output->close_audio(); |
| 481 } | 481 } |
