It should be obvious in which thread or context a function is being
executed at runtime. The code which was left in decode.c is for the
decoder thread itself; give the file a better name.
---
src/Makefile.am | 3 +
src/decode.c | 197 -------------------------------------------------
src/decode.h | 2 -
src/decoder_thread.c | 199 ++++++++++++++++++++++++++++++++++++++++++++++++++
src/decoder_thread.h | 25 ++++++
src/main.c | 2 -
6 files changed, 227 insertions(+), 201 deletions(-)
delete mode 100644 src/decode.c
create mode 100644 src/decoder_thread.c
create mode 100644 src/decoder_thread.h
diff --git a/src/Makefile.am b/src/Makefile.am
index 28a949b..ff4db35 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -41,6 +41,7 @@ mpd_headers = \
crossfade.h \
dbUtils.h \
decode.h \
+ decoder_thread.h \
decoder_api.h \
decoder_internal.h \
directory.h \
@@ -106,7 +107,7 @@ mpd_SOURCES = \
conf.c \
crossfade.c \
dbUtils.c \
- decode.c \
+ decoder_thread.c \
decoder_control.c \
decoder_api.c \
directory.c \
diff --git a/src/decode.c b/src/decode.c
deleted file mode 100644
index 3362077..0000000
--- a/src/decode.c
+++ /dev/null
@@ -1,197 +0,0 @@
-/* the Music Player Daemon (MPD)
- * Copyright (C) 2003-2007 by Warren Dukes ([EMAIL PROTECTED])
- * This project's homepage is: http://www.musicpd.org
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#include "decode.h"
-#include "decoder_internal.h"
-#include "player.h"
-
-#include "path.h"
-#include "log.h"
-#include "ls.h"
-
-static void decodeStart(void)
-{
- struct decoder decoder;
- int ret;
- int close_instream = 1;
- InputStream inStream;
- struct decoder_plugin *plugin = NULL;
- char path_max_fs[MPD_PATH_MAX];
- char path_max_utf8[MPD_PATH_MAX];
-
- if (!get_song_url(path_max_utf8, dc.next_song)) {
- dc.error = DECODE_ERROR_FILE;
- goto stop_no_close;
- }
- if (!isRemoteUrl(path_max_utf8)) {
- rmp2amp_r(path_max_fs,
- utf8_to_fs_charset(path_max_fs, path_max_utf8));
- } else
- pathcpy_trunc(path_max_fs, path_max_utf8);
-
- dc.current_song = dc.next_song; /* NEED LOCK */
- if (openInputStream(&inStream, path_max_fs) < 0) {
- dc.error = DECODE_ERROR_FILE;
- goto stop_no_close;
- }
-
- decoder.seeking = 0;
-
- dc.state = DECODE_STATE_START;
- dc.command = DECODE_COMMAND_NONE;
-
- /* wait for the input stream to become ready; its metadata
- will be available then */
-
- while (!inStream.ready) {
- if (dc.command != DECODE_COMMAND_NONE)
- goto stop;
-
- ret = bufferInputStream(&inStream);
- if (ret < 0)
- goto stop;
- }
-
- /* for http streams, seekable is determined in bufferInputStream */
- dc.seekable = inStream.seekable;
-
- if (dc.command == DECODE_COMMAND_STOP)
- goto stop;
-
- ret = DECODE_ERROR_UNKTYPE;
- if (isRemoteUrl(path_max_utf8)) {
- unsigned int next = 0;
-
- /* first we try mime types: */
- while (ret && (plugin =
decoder_plugin_from_mime_type(inStream.mime, next++))) {
- if (!plugin->stream_decode_func)
- continue;
- if (!(plugin->stream_types & INPUT_PLUGIN_STREAM_URL))
- continue;
- if (plugin->try_decode_func
- && !plugin->try_decode_func(&inStream))
- continue;
- ret = plugin->stream_decode_func(&decoder, &inStream);
- break;
- }
-
- /* if that fails, try suffix matching the URL: */
- if (plugin == NULL) {
- const char *s = getSuffix(path_max_utf8);
- next = 0;
- while (ret && (plugin = decoder_plugin_from_suffix(s,
next++))) {
- if (!plugin->stream_decode_func)
- continue;
- if (!(plugin->stream_types &
- INPUT_PLUGIN_STREAM_URL))
- continue;
- if (plugin->try_decode_func &&
- !plugin->try_decode_func(&inStream))
- continue;
- decoder.plugin = plugin;
- ret = plugin->stream_decode_func(&decoder,
- &inStream);
- break;
- }
- }
- /* fallback to mp3: */
- /* this is needed for bastard streams that don't have a suffix
- or set the mimeType */
- if (plugin == NULL) {
- /* we already know our mp3Plugin supports streams, no
- * need to check for stream{Types,DecodeFunc} */
- if ((plugin = decoder_plugin_from_name("mp3"))) {
- decoder.plugin = plugin;
- ret = plugin->stream_decode_func(&decoder,
- &inStream);
- }
- }
- } else {
- unsigned int next = 0;
- const char *s = getSuffix(path_max_utf8);
- while (ret && (plugin = decoder_plugin_from_suffix(s, next++)))
{
- if (!plugin->stream_types & INPUT_PLUGIN_STREAM_FILE)
- continue;
-
- if (plugin->try_decode_func &&
- !plugin->try_decode_func(&inStream))
- continue;
-
- if (plugin->file_decode_func) {
- closeInputStream(&inStream);
- close_instream = 0;
- decoder.plugin = plugin;
- ret = plugin->file_decode_func(&decoder,
- path_max_fs);
- break;
- } else if (plugin->stream_decode_func) {
- decoder.plugin = plugin;
- ret = plugin->stream_decode_func(&decoder,
- &inStream);
- break;
- }
- }
- }
-
- if (ret < 0 || ret == DECODE_ERROR_UNKTYPE) {
- if (ret != DECODE_ERROR_UNKTYPE)
- dc.error = DECODE_ERROR_FILE;
- else
- dc.error = DECODE_ERROR_UNKTYPE;
- }
-
-stop:
- if (close_instream)
- closeInputStream(&inStream);
-stop_no_close:
- dc.state = DECODE_STATE_STOP;
- dc.command = DECODE_COMMAND_NONE;
-}
-
-static void * decoder_task(mpd_unused void *arg)
-{
- notify_enter(&dc.notify);
-
- while (1) {
- assert(dc.state == DECODE_STATE_STOP);
-
- if (dc.command == DECODE_COMMAND_START ||
- dc.command == DECODE_COMMAND_SEEK) {
- decodeStart();
- } else if (dc.command == DECODE_COMMAND_STOP) {
- dc.command = DECODE_COMMAND_NONE;
- notify_signal(&pc.notify);
- } else {
- notify_wait(&dc.notify);
- notify_signal(&pc.notify);
- }
- }
-
- return NULL;
-}
-
-void decoderInit(void)
-{
- pthread_attr_t attr;
- pthread_t decoder_thread;
-
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
- if (pthread_create(&decoder_thread, &attr, decoder_task, NULL))
- FATAL("Failed to spawn decoder task: %s\n", strerror(errno));
-}
diff --git a/src/decode.h b/src/decode.h
index a1ed041..0b1fe38 100644
--- a/src/decode.h
+++ b/src/decode.h
@@ -55,8 +55,6 @@ struct decoder_control {
extern struct decoder_control dc;
-void decoderInit(void);
-
static inline int decoder_is_idle(void)
{
return dc.state == DECODE_STATE_STOP &&
diff --git a/src/decoder_thread.c b/src/decoder_thread.c
new file mode 100644
index 0000000..4104b58
--- /dev/null
+++ b/src/decoder_thread.c
@@ -0,0 +1,199 @@
+/* the Music Player Daemon (MPD)
+ * Copyright (C) 2003-2007 by Warren Dukes ([EMAIL PROTECTED])
+ * Copyright (C) 2008 Max Kellermann <[EMAIL PROTECTED]>
+ * This project's homepage is: http://www.musicpd.org
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "decoder_thread.h"
+#include "decode.h"
+#include "decoder_internal.h"
+#include "player.h"
+
+#include "path.h"
+#include "log.h"
+#include "ls.h"
+
+static void decodeStart(void)
+{
+ struct decoder decoder;
+ int ret;
+ int close_instream = 1;
+ InputStream inStream;
+ struct decoder_plugin *plugin = NULL;
+ char path_max_fs[MPD_PATH_MAX];
+ char path_max_utf8[MPD_PATH_MAX];
+
+ if (!get_song_url(path_max_utf8, dc.next_song)) {
+ dc.error = DECODE_ERROR_FILE;
+ goto stop_no_close;
+ }
+ if (!isRemoteUrl(path_max_utf8)) {
+ rmp2amp_r(path_max_fs,
+ utf8_to_fs_charset(path_max_fs, path_max_utf8));
+ } else
+ pathcpy_trunc(path_max_fs, path_max_utf8);
+
+ dc.current_song = dc.next_song; /* NEED LOCK */
+ if (openInputStream(&inStream, path_max_fs) < 0) {
+ dc.error = DECODE_ERROR_FILE;
+ goto stop_no_close;
+ }
+
+ decoder.seeking = 0;
+
+ dc.state = DECODE_STATE_START;
+ dc.command = DECODE_COMMAND_NONE;
+
+ /* wait for the input stream to become ready; its metadata
+ will be available then */
+
+ while (!inStream.ready) {
+ if (dc.command != DECODE_COMMAND_NONE)
+ goto stop;
+
+ ret = bufferInputStream(&inStream);
+ if (ret < 0)
+ goto stop;
+ }
+
+ /* for http streams, seekable is determined in bufferInputStream */
+ dc.seekable = inStream.seekable;
+
+ if (dc.command == DECODE_COMMAND_STOP)
+ goto stop;
+
+ ret = DECODE_ERROR_UNKTYPE;
+ if (isRemoteUrl(path_max_utf8)) {
+ unsigned int next = 0;
+
+ /* first we try mime types: */
+ while (ret && (plugin =
decoder_plugin_from_mime_type(inStream.mime, next++))) {
+ if (!plugin->stream_decode_func)
+ continue;
+ if (!(plugin->stream_types & INPUT_PLUGIN_STREAM_URL))
+ continue;
+ if (plugin->try_decode_func
+ && !plugin->try_decode_func(&inStream))
+ continue;
+ ret = plugin->stream_decode_func(&decoder, &inStream);
+ break;
+ }
+
+ /* if that fails, try suffix matching the URL: */
+ if (plugin == NULL) {
+ const char *s = getSuffix(path_max_utf8);
+ next = 0;
+ while (ret && (plugin = decoder_plugin_from_suffix(s,
next++))) {
+ if (!plugin->stream_decode_func)
+ continue;
+ if (!(plugin->stream_types &
+ INPUT_PLUGIN_STREAM_URL))
+ continue;
+ if (plugin->try_decode_func &&
+ !plugin->try_decode_func(&inStream))
+ continue;
+ decoder.plugin = plugin;
+ ret = plugin->stream_decode_func(&decoder,
+ &inStream);
+ break;
+ }
+ }
+ /* fallback to mp3: */
+ /* this is needed for bastard streams that don't have a suffix
+ or set the mimeType */
+ if (plugin == NULL) {
+ /* we already know our mp3Plugin supports streams, no
+ * need to check for stream{Types,DecodeFunc} */
+ if ((plugin = decoder_plugin_from_name("mp3"))) {
+ decoder.plugin = plugin;
+ ret = plugin->stream_decode_func(&decoder,
+ &inStream);
+ }
+ }
+ } else {
+ unsigned int next = 0;
+ const char *s = getSuffix(path_max_utf8);
+ while (ret && (plugin = decoder_plugin_from_suffix(s, next++)))
{
+ if (!plugin->stream_types & INPUT_PLUGIN_STREAM_FILE)
+ continue;
+
+ if (plugin->try_decode_func &&
+ !plugin->try_decode_func(&inStream))
+ continue;
+
+ if (plugin->file_decode_func) {
+ closeInputStream(&inStream);
+ close_instream = 0;
+ decoder.plugin = plugin;
+ ret = plugin->file_decode_func(&decoder,
+ path_max_fs);
+ break;
+ } else if (plugin->stream_decode_func) {
+ decoder.plugin = plugin;
+ ret = plugin->stream_decode_func(&decoder,
+ &inStream);
+ break;
+ }
+ }
+ }
+
+ if (ret < 0 || ret == DECODE_ERROR_UNKTYPE) {
+ if (ret != DECODE_ERROR_UNKTYPE)
+ dc.error = DECODE_ERROR_FILE;
+ else
+ dc.error = DECODE_ERROR_UNKTYPE;
+ }
+
+stop:
+ if (close_instream)
+ closeInputStream(&inStream);
+stop_no_close:
+ dc.state = DECODE_STATE_STOP;
+ dc.command = DECODE_COMMAND_NONE;
+}
+
+static void * decoder_task(mpd_unused void *arg)
+{
+ notify_enter(&dc.notify);
+
+ while (1) {
+ assert(dc.state == DECODE_STATE_STOP);
+
+ if (dc.command == DECODE_COMMAND_START ||
+ dc.command == DECODE_COMMAND_SEEK) {
+ decodeStart();
+ } else if (dc.command == DECODE_COMMAND_STOP) {
+ dc.command = DECODE_COMMAND_NONE;
+ notify_signal(&pc.notify);
+ } else {
+ notify_wait(&dc.notify);
+ notify_signal(&pc.notify);
+ }
+ }
+
+ return NULL;
+}
+
+void decoderInit(void)
+{
+ pthread_attr_t attr;
+ pthread_t decoder_thread;
+
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+ if (pthread_create(&decoder_thread, &attr, decoder_task, NULL))
+ FATAL("Failed to spawn decoder task: %s\n", strerror(errno));
+}
diff --git a/src/decoder_thread.h b/src/decoder_thread.h
new file mode 100644
index 0000000..439641e
--- /dev/null
+++ b/src/decoder_thread.h
@@ -0,0 +1,25 @@
+/* the Music Player Daemon (MPD)
+ * Copyright (C) 2003-2007 by Warren Dukes ([EMAIL PROTECTED])
+ * Copyright (C) 2008 Max Kellermann <[EMAIL PROTECTED]>
+ * This project's homepage is: http://www.musicpd.org
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef DECODER_THREAD_H
+#define DECODER_THREAD_H
+
+void decoderInit(void);
+
+#endif
diff --git a/src/main.c b/src/main.c
index 5a98b7e..cfb3845 100644
--- a/src/main.c
+++ b/src/main.c
@@ -25,7 +25,7 @@
#include "conf.h"
#include "path.h"
#include "playerData.h"
-#include "decode.h"
+#include "decoder_thread.h"
#include "player.h"
#include "stats.h"
#include "sig_handlers.h"
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Musicpd-dev-team mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/musicpd-dev-team