Mercurial > audlegacy
annotate src/audacious/playback.c @ 4530:d2fd41d3964e
Stop playback (instead of doing endless loop) when file can't be read
author | Tomasz Mon <desowin@gmail.com> |
---|---|
date | Fri, 02 May 2008 10:34:07 +0200 |
parents | a849b8af8db6 |
children | 024be3d7ef4c |
rev | line source |
---|---|
2313 | 1 /* Audacious - Cross-platform multimedia player |
2 * Copyright (C) 2005-2007 Audacious development team | |
3 * | |
4 * Based on BMP: | |
5 * Copyright (C) 2003-2004 BMP development team. | |
6 * | |
7 * Based on XMMS: | |
8 * Copyright (C) 1998-2003 XMMS development team. | |
9 * | |
10 * This program is free software; you can redistribute it and/or modify | |
11 * it under the terms of the GNU General Public License as published by | |
3121
3b6d316f8b09
GPL3 relicensing.
William Pitcock <nenolod@atheme-project.org>
parents:
3093
diff
changeset
|
12 * the Free Software Foundation; under version 3 of the License. |
2313 | 13 * |
14 * This program is distributed in the hope that it will be useful, | |
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 * GNU General Public License for more details. | |
18 * | |
19 * You should have received a copy of the GNU General Public License | |
3121
3b6d316f8b09
GPL3 relicensing.
William Pitcock <nenolod@atheme-project.org>
parents:
3093
diff
changeset
|
20 * along with this program. If not, see <http://www.gnu.org/licenses>. |
3123
f1c756f39e6c
Invoke "Plugins are not derived work" clause provided by GPL3.
William Pitcock <nenolod@atheme-project.org>
parents:
3121
diff
changeset
|
21 * |
f1c756f39e6c
Invoke "Plugins are not derived work" clause provided by GPL3.
William Pitcock <nenolod@atheme-project.org>
parents:
3121
diff
changeset
|
22 * The Audacious team does not consider modular code linking to |
f1c756f39e6c
Invoke "Plugins are not derived work" clause provided by GPL3.
William Pitcock <nenolod@atheme-project.org>
parents:
3121
diff
changeset
|
23 * Audacious or using our public API to be a derived work. |
2313 | 24 */ |
25 | |
26 #ifdef HAVE_CONFIG_H | |
27 # include "config.h" | |
28 #endif | |
29 | |
30 #include <glib.h> | |
31 #include <glib/gi18n.h> | |
32 #include <glib/gprintf.h> | |
33 #include <stdlib.h> | |
34 #include <string.h> | |
35 #include <time.h> | |
36 | |
37 #include <unistd.h> | |
38 #include <sys/types.h> | |
39 #include <sys/stat.h> | |
40 #include <dirent.h> | |
41 | |
2717 | 42 #include "configdb.h" |
4346 | 43 #include "eventqueue.h" |
2420 | 44 #include "hook.h" |
2313 | 45 #include "input.h" |
46 #include "output.h" | |
47 #include "playlist.h" | |
4346 | 48 #include "pluginenum.h" |
2313 | 49 #include "util.h" |
50 | |
51 #include "playback.h" | |
3152
c9471f83944c
Add playback_eof(). Plugins should use this instead of playback->eof = 1.
William Pitcock <nenolod@atheme-project.org>
parents:
3128
diff
changeset
|
52 #include "playback_evlisteners.h" |
2313 | 53 |
4505 | 54 static PlaybackInfo playback_info = { 0, 0, 0 }; |
55 | |
3319
d4f6507cded3
added a system that allows input plugins to signal to the core (actually, they MUST do it) that they're ready for playback and it's safe to call their stop function; this fixes a nasty race condition that triggered on fast track-switching
Giacomo Lozito <james@develia.org>
parents:
3259
diff
changeset
|
56 static gint |
d4f6507cded3
added a system that allows input plugins to signal to the core (actually, they MUST do it) that they're ready for playback and it's safe to call their stop function; this fixes a nasty race condition that triggered on fast track-switching
Giacomo Lozito <james@develia.org>
parents:
3259
diff
changeset
|
57 playback_set_pb_ready(InputPlayback *playback) |
d4f6507cded3
added a system that allows input plugins to signal to the core (actually, they MUST do it) that they're ready for playback and it's safe to call their stop function; this fixes a nasty race condition that triggered on fast track-switching
Giacomo Lozito <james@develia.org>
parents:
3259
diff
changeset
|
58 { |
d4f6507cded3
added a system that allows input plugins to signal to the core (actually, they MUST do it) that they're ready for playback and it's safe to call their stop function; this fixes a nasty race condition that triggered on fast track-switching
Giacomo Lozito <james@develia.org>
parents:
3259
diff
changeset
|
59 g_mutex_lock(playback->pb_ready_mutex); |
d4f6507cded3
added a system that allows input plugins to signal to the core (actually, they MUST do it) that they're ready for playback and it's safe to call their stop function; this fixes a nasty race condition that triggered on fast track-switching
Giacomo Lozito <james@develia.org>
parents:
3259
diff
changeset
|
60 playback->pb_ready_val = 1; |
d4f6507cded3
added a system that allows input plugins to signal to the core (actually, they MUST do it) that they're ready for playback and it's safe to call their stop function; this fixes a nasty race condition that triggered on fast track-switching
Giacomo Lozito <james@develia.org>
parents:
3259
diff
changeset
|
61 g_cond_signal(playback->pb_ready_cond); |
d4f6507cded3
added a system that allows input plugins to signal to the core (actually, they MUST do it) that they're ready for playback and it's safe to call their stop function; this fixes a nasty race condition that triggered on fast track-switching
Giacomo Lozito <james@develia.org>
parents:
3259
diff
changeset
|
62 g_mutex_unlock(playback->pb_ready_mutex); |
d4f6507cded3
added a system that allows input plugins to signal to the core (actually, they MUST do it) that they're ready for playback and it's safe to call their stop function; this fixes a nasty race condition that triggered on fast track-switching
Giacomo Lozito <james@develia.org>
parents:
3259
diff
changeset
|
63 return 0; |
d4f6507cded3
added a system that allows input plugins to signal to the core (actually, they MUST do it) that they're ready for playback and it's safe to call their stop function; this fixes a nasty race condition that triggered on fast track-switching
Giacomo Lozito <james@develia.org>
parents:
3259
diff
changeset
|
64 } |
d4f6507cded3
added a system that allows input plugins to signal to the core (actually, they MUST do it) that they're ready for playback and it's safe to call their stop function; this fixes a nasty race condition that triggered on fast track-switching
Giacomo Lozito <james@develia.org>
parents:
3259
diff
changeset
|
65 |
d4f6507cded3
added a system that allows input plugins to signal to the core (actually, they MUST do it) that they're ready for playback and it's safe to call their stop function; this fixes a nasty race condition that triggered on fast track-switching
Giacomo Lozito <james@develia.org>
parents:
3259
diff
changeset
|
66 static gint |
d4f6507cded3
added a system that allows input plugins to signal to the core (actually, they MUST do it) that they're ready for playback and it's safe to call their stop function; this fixes a nasty race condition that triggered on fast track-switching
Giacomo Lozito <james@develia.org>
parents:
3259
diff
changeset
|
67 playback_wait_for_pb_ready(InputPlayback *playback) |
d4f6507cded3
added a system that allows input plugins to signal to the core (actually, they MUST do it) that they're ready for playback and it's safe to call their stop function; this fixes a nasty race condition that triggered on fast track-switching
Giacomo Lozito <james@develia.org>
parents:
3259
diff
changeset
|
68 { |
d4f6507cded3
added a system that allows input plugins to signal to the core (actually, they MUST do it) that they're ready for playback and it's safe to call their stop function; this fixes a nasty race condition that triggered on fast track-switching
Giacomo Lozito <james@develia.org>
parents:
3259
diff
changeset
|
69 g_mutex_lock(playback->pb_ready_mutex); |
d4f6507cded3
added a system that allows input plugins to signal to the core (actually, they MUST do it) that they're ready for playback and it's safe to call their stop function; this fixes a nasty race condition that triggered on fast track-switching
Giacomo Lozito <james@develia.org>
parents:
3259
diff
changeset
|
70 while (playback->pb_ready_val != 1) |
d4f6507cded3
added a system that allows input plugins to signal to the core (actually, they MUST do it) that they're ready for playback and it's safe to call their stop function; this fixes a nasty race condition that triggered on fast track-switching
Giacomo Lozito <james@develia.org>
parents:
3259
diff
changeset
|
71 g_cond_wait(playback->pb_ready_cond, playback->pb_ready_mutex); |
d4f6507cded3
added a system that allows input plugins to signal to the core (actually, they MUST do it) that they're ready for playback and it's safe to call their stop function; this fixes a nasty race condition that triggered on fast track-switching
Giacomo Lozito <james@develia.org>
parents:
3259
diff
changeset
|
72 g_mutex_unlock(playback->pb_ready_mutex); |
d4f6507cded3
added a system that allows input plugins to signal to the core (actually, they MUST do it) that they're ready for playback and it's safe to call their stop function; this fixes a nasty race condition that triggered on fast track-switching
Giacomo Lozito <james@develia.org>
parents:
3259
diff
changeset
|
73 return 0; |
d4f6507cded3
added a system that allows input plugins to signal to the core (actually, they MUST do it) that they're ready for playback and it's safe to call their stop function; this fixes a nasty race condition that triggered on fast track-switching
Giacomo Lozito <james@develia.org>
parents:
3259
diff
changeset
|
74 } |
d4f6507cded3
added a system that allows input plugins to signal to the core (actually, they MUST do it) that they're ready for playback and it's safe to call their stop function; this fixes a nasty race condition that triggered on fast track-switching
Giacomo Lozito <james@develia.org>
parents:
3259
diff
changeset
|
75 |
3696
418ac922ce87
Use a mutex/condvar/timed wait to allow tickless operation in the output loop.
William Pitcock <nenolod@atheme.org>
parents:
3677
diff
changeset
|
76 static void |
418ac922ce87
Use a mutex/condvar/timed wait to allow tickless operation in the output loop.
William Pitcock <nenolod@atheme.org>
parents:
3677
diff
changeset
|
77 playback_set_pb_change(InputPlayback *playback) |
418ac922ce87
Use a mutex/condvar/timed wait to allow tickless operation in the output loop.
William Pitcock <nenolod@atheme.org>
parents:
3677
diff
changeset
|
78 { |
418ac922ce87
Use a mutex/condvar/timed wait to allow tickless operation in the output loop.
William Pitcock <nenolod@atheme.org>
parents:
3677
diff
changeset
|
79 g_mutex_lock(playback->pb_change_mutex); |
418ac922ce87
Use a mutex/condvar/timed wait to allow tickless operation in the output loop.
William Pitcock <nenolod@atheme.org>
parents:
3677
diff
changeset
|
80 g_cond_signal(playback->pb_change_cond); |
418ac922ce87
Use a mutex/condvar/timed wait to allow tickless operation in the output loop.
William Pitcock <nenolod@atheme.org>
parents:
3677
diff
changeset
|
81 g_mutex_unlock(playback->pb_change_mutex); |
418ac922ce87
Use a mutex/condvar/timed wait to allow tickless operation in the output loop.
William Pitcock <nenolod@atheme.org>
parents:
3677
diff
changeset
|
82 } |
418ac922ce87
Use a mutex/condvar/timed wait to allow tickless operation in the output loop.
William Pitcock <nenolod@atheme.org>
parents:
3677
diff
changeset
|
83 |
3705
38259e9394a2
add InputPlayback::set_params() and InputPlayback::set_title() which will
William Pitcock <nenolod@atheme.org>
parents:
3696
diff
changeset
|
84 static void |
38259e9394a2
add InputPlayback::set_params() and InputPlayback::set_title() which will
William Pitcock <nenolod@atheme.org>
parents:
3696
diff
changeset
|
85 playback_set_pb_params(InputPlayback *playback, gchar *title, |
38259e9394a2
add InputPlayback::set_params() and InputPlayback::set_title() which will
William Pitcock <nenolod@atheme.org>
parents:
3696
diff
changeset
|
86 gint length, gint rate, gint freq, gint nch) |
38259e9394a2
add InputPlayback::set_params() and InputPlayback::set_title() which will
William Pitcock <nenolod@atheme.org>
parents:
3696
diff
changeset
|
87 { |
38259e9394a2
add InputPlayback::set_params() and InputPlayback::set_title() which will
William Pitcock <nenolod@atheme.org>
parents:
3696
diff
changeset
|
88 playback->title = g_strdup(title); |
38259e9394a2
add InputPlayback::set_params() and InputPlayback::set_title() which will
William Pitcock <nenolod@atheme.org>
parents:
3696
diff
changeset
|
89 playback->length = length; |
38259e9394a2
add InputPlayback::set_params() and InputPlayback::set_title() which will
William Pitcock <nenolod@atheme.org>
parents:
3696
diff
changeset
|
90 playback->rate = rate; |
38259e9394a2
add InputPlayback::set_params() and InputPlayback::set_title() which will
William Pitcock <nenolod@atheme.org>
parents:
3696
diff
changeset
|
91 playback->freq = freq; |
38259e9394a2
add InputPlayback::set_params() and InputPlayback::set_title() which will
William Pitcock <nenolod@atheme.org>
parents:
3696
diff
changeset
|
92 playback->nch = nch; |
38259e9394a2
add InputPlayback::set_params() and InputPlayback::set_title() which will
William Pitcock <nenolod@atheme.org>
parents:
3696
diff
changeset
|
93 |
38259e9394a2
add InputPlayback::set_params() and InputPlayback::set_title() which will
William Pitcock <nenolod@atheme.org>
parents:
3696
diff
changeset
|
94 /* XXX: this can be removed/merged here someday */ |
4266
2b7a74fce100
Implemented support for multiple subplugins inside a plugin (see bug #148) and PluginHeader finalization
stefano@zanga
parents:
4235
diff
changeset
|
95 plugin_set_current((Plugin *)(playback->plugin)); |
3705
38259e9394a2
add InputPlayback::set_params() and InputPlayback::set_title() which will
William Pitcock <nenolod@atheme.org>
parents:
3696
diff
changeset
|
96 playback->plugin->set_info(title, length, rate, freq, nch); |
38259e9394a2
add InputPlayback::set_params() and InputPlayback::set_title() which will
William Pitcock <nenolod@atheme.org>
parents:
3696
diff
changeset
|
97 } |
38259e9394a2
add InputPlayback::set_params() and InputPlayback::set_title() which will
William Pitcock <nenolod@atheme.org>
parents:
3696
diff
changeset
|
98 |
38259e9394a2
add InputPlayback::set_params() and InputPlayback::set_title() which will
William Pitcock <nenolod@atheme.org>
parents:
3696
diff
changeset
|
99 static void |
38259e9394a2
add InputPlayback::set_params() and InputPlayback::set_title() which will
William Pitcock <nenolod@atheme.org>
parents:
3696
diff
changeset
|
100 playback_set_pb_title(InputPlayback *playback, gchar *title) |
38259e9394a2
add InputPlayback::set_params() and InputPlayback::set_title() which will
William Pitcock <nenolod@atheme.org>
parents:
3696
diff
changeset
|
101 { |
38259e9394a2
add InputPlayback::set_params() and InputPlayback::set_title() which will
William Pitcock <nenolod@atheme.org>
parents:
3696
diff
changeset
|
102 playback->title = g_strdup(title); |
38259e9394a2
add InputPlayback::set_params() and InputPlayback::set_title() which will
William Pitcock <nenolod@atheme.org>
parents:
3696
diff
changeset
|
103 |
4266
2b7a74fce100
Implemented support for multiple subplugins inside a plugin (see bug #148) and PluginHeader finalization
stefano@zanga
parents:
4235
diff
changeset
|
104 plugin_set_current((Plugin *)(playback->plugin)); |
3705
38259e9394a2
add InputPlayback::set_params() and InputPlayback::set_title() which will
William Pitcock <nenolod@atheme.org>
parents:
3696
diff
changeset
|
105 playback->plugin->set_info_text(title); |
38259e9394a2
add InputPlayback::set_params() and InputPlayback::set_title() which will
William Pitcock <nenolod@atheme.org>
parents:
3696
diff
changeset
|
106 } |
38259e9394a2
add InputPlayback::set_params() and InputPlayback::set_title() which will
William Pitcock <nenolod@atheme.org>
parents:
3696
diff
changeset
|
107 |
3152
c9471f83944c
Add playback_eof(). Plugins should use this instead of playback->eof = 1.
William Pitcock <nenolod@atheme-project.org>
parents:
3128
diff
changeset
|
108 void |
c9471f83944c
Add playback_eof(). Plugins should use this instead of playback->eof = 1.
William Pitcock <nenolod@atheme-project.org>
parents:
3128
diff
changeset
|
109 playback_eof(void) |
c9471f83944c
Add playback_eof(). Plugins should use this instead of playback->eof = 1.
William Pitcock <nenolod@atheme-project.org>
parents:
3128
diff
changeset
|
110 { |
c9471f83944c
Add playback_eof(). Plugins should use this instead of playback->eof = 1.
William Pitcock <nenolod@atheme-project.org>
parents:
3128
diff
changeset
|
111 event_queue("playback eof", playlist_get_active()); |
c9471f83944c
Add playback_eof(). Plugins should use this instead of playback->eof = 1.
William Pitcock <nenolod@atheme-project.org>
parents:
3128
diff
changeset
|
112 } |
c9471f83944c
Add playback_eof(). Plugins should use this instead of playback->eof = 1.
William Pitcock <nenolod@atheme-project.org>
parents:
3128
diff
changeset
|
113 |
3158
92717dcb09f6
Send a message from the monitor thread to the main thread for audio errors, like we do with eof condition.
William Pitcock <nenolod@atheme-project.org>
parents:
3156
diff
changeset
|
114 void |
92717dcb09f6
Send a message from the monitor thread to the main thread for audio errors, like we do with eof condition.
William Pitcock <nenolod@atheme-project.org>
parents:
3156
diff
changeset
|
115 playback_error(void) |
92717dcb09f6
Send a message from the monitor thread to the main thread for audio errors, like we do with eof condition.
William Pitcock <nenolod@atheme-project.org>
parents:
3156
diff
changeset
|
116 { |
92717dcb09f6
Send a message from the monitor thread to the main thread for audio errors, like we do with eof condition.
William Pitcock <nenolod@atheme-project.org>
parents:
3156
diff
changeset
|
117 event_queue("playback audio error", NULL); |
92717dcb09f6
Send a message from the monitor thread to the main thread for audio errors, like we do with eof condition.
William Pitcock <nenolod@atheme-project.org>
parents:
3156
diff
changeset
|
118 } |
92717dcb09f6
Send a message from the monitor thread to the main thread for audio errors, like we do with eof condition.
William Pitcock <nenolod@atheme-project.org>
parents:
3156
diff
changeset
|
119 |
2313 | 120 gint |
121 playback_get_time(void) | |
122 { | |
2438
8750a62abed8
[svn] Provide flags in InputPlayback for common plugin flag needs, and provide a
iabervon
parents:
2436
diff
changeset
|
123 InputPlayback *playback; |
2420 | 124 g_return_val_if_fail(playback_get_playing(), -1); |
2438
8750a62abed8
[svn] Provide flags in InputPlayback for common plugin flag needs, and provide a
iabervon
parents:
2436
diff
changeset
|
125 playback = get_current_input_playback(); |
2313 | 126 |
3180
384cb84c968f
Gracefully handle playback being NULL even if playback_get_playing() is TRUE during playback init.
Christian Birchinger <joker@netswarm.net>
parents:
3179
diff
changeset
|
127 if (!playback) /* playback can be NULL during init even if playing is TRUE */ |
384cb84c968f
Gracefully handle playback being NULL even if playback_get_playing() is TRUE during playback init.
Christian Birchinger <joker@netswarm.net>
parents:
3179
diff
changeset
|
128 return -1; |
4266
2b7a74fce100
Implemented support for multiple subplugins inside a plugin (see bug #148) and PluginHeader finalization
stefano@zanga
parents:
4235
diff
changeset
|
129 plugin_set_current((Plugin *)(playback->plugin)); |
2438
8750a62abed8
[svn] Provide flags in InputPlayback for common plugin flag needs, and provide a
iabervon
parents:
2436
diff
changeset
|
130 if (playback->plugin->get_time) |
4266
2b7a74fce100
Implemented support for multiple subplugins inside a plugin (see bug #148) and PluginHeader finalization
stefano@zanga
parents:
4235
diff
changeset
|
131 { |
2b7a74fce100
Implemented support for multiple subplugins inside a plugin (see bug #148) and PluginHeader finalization
stefano@zanga
parents:
4235
diff
changeset
|
132 plugin_set_current((Plugin *)(playback->plugin)); |
2438
8750a62abed8
[svn] Provide flags in InputPlayback for common plugin flag needs, and provide a
iabervon
parents:
2436
diff
changeset
|
133 return playback->plugin->get_time(playback); |
4266
2b7a74fce100
Implemented support for multiple subplugins inside a plugin (see bug #148) and PluginHeader finalization
stefano@zanga
parents:
4235
diff
changeset
|
134 } |
2438
8750a62abed8
[svn] Provide flags in InputPlayback for common plugin flag needs, and provide a
iabervon
parents:
2436
diff
changeset
|
135 if (playback->error) |
8750a62abed8
[svn] Provide flags in InputPlayback for common plugin flag needs, and provide a
iabervon
parents:
2436
diff
changeset
|
136 return -2; |
8750a62abed8
[svn] Provide flags in InputPlayback for common plugin flag needs, and provide a
iabervon
parents:
2436
diff
changeset
|
137 if (!playback->playing || |
3346
71d8d93f1bad
Implemented TrackChange, StatusChange signals, with a stub for CapsChange.
Ben Tucker <ben.tucker@gmail.com>
parents:
3326
diff
changeset
|
138 (playback->eof && !playback->output->buffer_playing())) |
2438
8750a62abed8
[svn] Provide flags in InputPlayback for common plugin flag needs, and provide a
iabervon
parents:
2436
diff
changeset
|
139 return -1; |
8750a62abed8
[svn] Provide flags in InputPlayback for common plugin flag needs, and provide a
iabervon
parents:
2436
diff
changeset
|
140 return playback->output->output_time(); |
2313 | 141 } |
142 | |
3716
9489aae0d872
introduce playback_get_length()
Tomasz Mon <desowin@gmail.com>
parents:
3711
diff
changeset
|
143 gint |
9489aae0d872
introduce playback_get_length()
Tomasz Mon <desowin@gmail.com>
parents:
3711
diff
changeset
|
144 playback_get_length(void) |
9489aae0d872
introduce playback_get_length()
Tomasz Mon <desowin@gmail.com>
parents:
3711
diff
changeset
|
145 { |
9489aae0d872
introduce playback_get_length()
Tomasz Mon <desowin@gmail.com>
parents:
3711
diff
changeset
|
146 InputPlayback *playback; |
9489aae0d872
introduce playback_get_length()
Tomasz Mon <desowin@gmail.com>
parents:
3711
diff
changeset
|
147 g_return_val_if_fail(playback_get_playing(), -1); |
9489aae0d872
introduce playback_get_length()
Tomasz Mon <desowin@gmail.com>
parents:
3711
diff
changeset
|
148 playback = get_current_input_playback(); |
9489aae0d872
introduce playback_get_length()
Tomasz Mon <desowin@gmail.com>
parents:
3711
diff
changeset
|
149 |
3717
8ec5bb8aac58
playback_get_length(): Support InputPlayback::set_params().
William Pitcock <nenolod@atheme.org>
parents:
3716
diff
changeset
|
150 if (playback->length) |
8ec5bb8aac58
playback_get_length(): Support InputPlayback::set_params().
William Pitcock <nenolod@atheme.org>
parents:
3716
diff
changeset
|
151 return playback->length; |
8ec5bb8aac58
playback_get_length(): Support InputPlayback::set_params().
William Pitcock <nenolod@atheme.org>
parents:
3716
diff
changeset
|
152 |
3716
9489aae0d872
introduce playback_get_length()
Tomasz Mon <desowin@gmail.com>
parents:
3711
diff
changeset
|
153 if (playback && playback->plugin->get_song_tuple) { |
4266
2b7a74fce100
Implemented support for multiple subplugins inside a plugin (see bug #148) and PluginHeader finalization
stefano@zanga
parents:
4235
diff
changeset
|
154 plugin_set_current((Plugin *)(playback->plugin)); |
3716
9489aae0d872
introduce playback_get_length()
Tomasz Mon <desowin@gmail.com>
parents:
3711
diff
changeset
|
155 Tuple *tuple = playback->plugin->get_song_tuple(playback->filename); |
9489aae0d872
introduce playback_get_length()
Tomasz Mon <desowin@gmail.com>
parents:
3711
diff
changeset
|
156 if (tuple_get_value_type(tuple, FIELD_LENGTH, NULL) == TUPLE_INT) |
3926
05e6d9db003c
playback_get_length() had always returned 1 whenever it uses tuple.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
3722
diff
changeset
|
157 return tuple_get_int(tuple, FIELD_LENGTH, NULL); |
3716
9489aae0d872
introduce playback_get_length()
Tomasz Mon <desowin@gmail.com>
parents:
3711
diff
changeset
|
158 } |
3717
8ec5bb8aac58
playback_get_length(): Support InputPlayback::set_params().
William Pitcock <nenolod@atheme.org>
parents:
3716
diff
changeset
|
159 |
3716
9489aae0d872
introduce playback_get_length()
Tomasz Mon <desowin@gmail.com>
parents:
3711
diff
changeset
|
160 return -1; |
9489aae0d872
introduce playback_get_length()
Tomasz Mon <desowin@gmail.com>
parents:
3711
diff
changeset
|
161 } |
9489aae0d872
introduce playback_get_length()
Tomasz Mon <desowin@gmail.com>
parents:
3711
diff
changeset
|
162 |
2313 | 163 void |
164 playback_initiate(void) | |
165 { | |
166 PlaylistEntry *entry = NULL; | |
167 Playlist *playlist = playlist_get_active(); | |
168 | |
2420 | 169 g_return_if_fail(playlist_get_length(playlist) != 0); |
2313 | 170 |
3152
c9471f83944c
Add playback_eof(). Plugins should use this instead of playback->eof = 1.
William Pitcock <nenolod@atheme-project.org>
parents:
3128
diff
changeset
|
171 /* initialize playback event listeners if not done already */ |
c9471f83944c
Add playback_eof(). Plugins should use this instead of playback->eof = 1.
William Pitcock <nenolod@atheme-project.org>
parents:
3128
diff
changeset
|
172 playback_evlistener_init(); |
c9471f83944c
Add playback_eof(). Plugins should use this instead of playback->eof = 1.
William Pitcock <nenolod@atheme-project.org>
parents:
3128
diff
changeset
|
173 |
2313 | 174 if (playback_get_playing()) |
175 playback_stop(); | |
176 | |
177 entry = playlist_get_entry_to_play(playlist); | |
2420 | 178 g_return_if_fail(entry != NULL); |
4530
d2fd41d3964e
Stop playback (instead of doing endless loop) when file can't be read
Tomasz Mon <desowin@gmail.com>
parents:
4505
diff
changeset
|
179 |
d2fd41d3964e
Stop playback (instead of doing endless loop) when file can't be read
Tomasz Mon <desowin@gmail.com>
parents:
4505
diff
changeset
|
180 if (!playback_play_file(entry)) |
d2fd41d3964e
Stop playback (instead of doing endless loop) when file can't be read
Tomasz Mon <desowin@gmail.com>
parents:
4505
diff
changeset
|
181 return; |
d2fd41d3964e
Stop playback (instead of doing endless loop) when file can't be read
Tomasz Mon <desowin@gmail.com>
parents:
4505
diff
changeset
|
182 |
3348
2a081105513c
-Set the track "title" in metadata instead of "name"
Ben Tucker <ben.tucker@gmail.com>
parents:
3346
diff
changeset
|
183 #ifdef USE_DBUS |
2a081105513c
-Set the track "title" in metadata instead of "name"
Ben Tucker <ben.tucker@gmail.com>
parents:
3346
diff
changeset
|
184 mpris_emit_track_change(mpris); |
2a081105513c
-Set the track "title" in metadata instead of "name"
Ben Tucker <ben.tucker@gmail.com>
parents:
3346
diff
changeset
|
185 #endif |
2313 | 186 |
187 playlist_check_pos_current(playlist); | |
3092
1ddeb9f068ab
Backed out changeset b87335249c69d45d253b1b960a9ec7f60b68e5a5
William Pitcock <nenolod@atheme-project.org>
parents:
3089
diff
changeset
|
188 |
1ddeb9f068ab
Backed out changeset b87335249c69d45d253b1b960a9ec7f60b68e5a5
William Pitcock <nenolod@atheme-project.org>
parents:
3089
diff
changeset
|
189 hook_call("playback begin", entry); |
2313 | 190 } |
191 | |
192 void | |
193 playback_pause(void) | |
194 { | |
3170
603577228518
get_current_input_playback() cleanups.
William Pitcock <nenolod@atheme-project.org>
parents:
3168
diff
changeset
|
195 InputPlayback *playback; |
603577228518
get_current_input_playback() cleanups.
William Pitcock <nenolod@atheme-project.org>
parents:
3168
diff
changeset
|
196 |
2313 | 197 if (!playback_get_playing()) |
198 return; | |
199 | |
3170
603577228518
get_current_input_playback() cleanups.
William Pitcock <nenolod@atheme-project.org>
parents:
3168
diff
changeset
|
200 if ((playback = get_current_input_playback()) == NULL) |
2313 | 201 return; |
202 | |
203 ip_data.paused = !ip_data.paused; | |
204 | |
3170
603577228518
get_current_input_playback() cleanups.
William Pitcock <nenolod@atheme-project.org>
parents:
3168
diff
changeset
|
205 if (playback->plugin->pause) |
4266
2b7a74fce100
Implemented support for multiple subplugins inside a plugin (see bug #148) and PluginHeader finalization
stefano@zanga
parents:
4235
diff
changeset
|
206 { |
2b7a74fce100
Implemented support for multiple subplugins inside a plugin (see bug #148) and PluginHeader finalization
stefano@zanga
parents:
4235
diff
changeset
|
207 plugin_set_current((Plugin *)(playback->plugin)); |
3170
603577228518
get_current_input_playback() cleanups.
William Pitcock <nenolod@atheme-project.org>
parents:
3168
diff
changeset
|
208 playback->plugin->pause(playback, ip_data.paused); |
4266
2b7a74fce100
Implemented support for multiple subplugins inside a plugin (see bug #148) and PluginHeader finalization
stefano@zanga
parents:
4235
diff
changeset
|
209 } |
2313 | 210 |
3039
c981df78db8c
added hooks: playback pause and playback unpause
Giacomo Lozito <james@develia.org>
parents:
3021
diff
changeset
|
211 if (ip_data.paused) |
c981df78db8c
added hooks: playback pause and playback unpause
Giacomo Lozito <james@develia.org>
parents:
3021
diff
changeset
|
212 hook_call("playback pause", NULL); |
c981df78db8c
added hooks: playback pause and playback unpause
Giacomo Lozito <james@develia.org>
parents:
3021
diff
changeset
|
213 else |
c981df78db8c
added hooks: playback pause and playback unpause
Giacomo Lozito <james@develia.org>
parents:
3021
diff
changeset
|
214 hook_call("playback unpause", NULL); |
c981df78db8c
added hooks: playback pause and playback unpause
Giacomo Lozito <james@develia.org>
parents:
3021
diff
changeset
|
215 |
3346
71d8d93f1bad
Implemented TrackChange, StatusChange signals, with a stub for CapsChange.
Ben Tucker <ben.tucker@gmail.com>
parents:
3326
diff
changeset
|
216 #ifdef USE_DBUS |
4359
0becb809bdc9
moved most GUI-related functions from playback.c to ui_main_evlisteners.c
mf0102 <0102@gmx.at>
parents:
4346
diff
changeset
|
217 if (ip_data.paused) |
3346
71d8d93f1bad
Implemented TrackChange, StatusChange signals, with a stub for CapsChange.
Ben Tucker <ben.tucker@gmail.com>
parents:
3326
diff
changeset
|
218 mpris_emit_status_change(mpris, MPRIS_STATUS_PAUSE); |
4359
0becb809bdc9
moved most GUI-related functions from playback.c to ui_main_evlisteners.c
mf0102 <0102@gmx.at>
parents:
4346
diff
changeset
|
219 else |
3346
71d8d93f1bad
Implemented TrackChange, StatusChange signals, with a stub for CapsChange.
Ben Tucker <ben.tucker@gmail.com>
parents:
3326
diff
changeset
|
220 mpris_emit_status_change(mpris, MPRIS_STATUS_PLAY); |
71d8d93f1bad
Implemented TrackChange, StatusChange signals, with a stub for CapsChange.
Ben Tucker <ben.tucker@gmail.com>
parents:
3326
diff
changeset
|
221 #endif |
2313 | 222 } |
223 | |
224 void | |
225 playback_stop(void) | |
226 { | |
3170
603577228518
get_current_input_playback() cleanups.
William Pitcock <nenolod@atheme-project.org>
parents:
3168
diff
changeset
|
227 InputPlayback *playback; |
3252
eddeaebaf1c7
- fixed ugly race condition in new threading model; mutexes are also probably required to handle shared access to ip_data
Giacomo Lozito <james@develia.org>
parents:
3251
diff
changeset
|
228 |
3253
6374d66ee623
proper race condition fix
William Pitcock <nenolod@atheme-project.org>
parents:
3252
diff
changeset
|
229 if ((playback = get_current_input_playback()) == NULL) |
6374d66ee623
proper race condition fix
William Pitcock <nenolod@atheme-project.org>
parents:
3252
diff
changeset
|
230 return; |
2313 | 231 |
3252
eddeaebaf1c7
- fixed ugly race condition in new threading model; mutexes are also probably required to handle shared access to ip_data
Giacomo Lozito <james@develia.org>
parents:
3251
diff
changeset
|
232 if (ip_data.playing) |
3170
603577228518
get_current_input_playback() cleanups.
William Pitcock <nenolod@atheme-project.org>
parents:
3168
diff
changeset
|
233 { |
3319
d4f6507cded3
added a system that allows input plugins to signal to the core (actually, they MUST do it) that they're ready for playback and it's safe to call their stop function; this fixes a nasty race condition that triggered on fast track-switching
Giacomo Lozito <james@develia.org>
parents:
3259
diff
changeset
|
234 /* wait for plugin to signal it has reached |
d4f6507cded3
added a system that allows input plugins to signal to the core (actually, they MUST do it) that they're ready for playback and it's safe to call their stop function; this fixes a nasty race condition that triggered on fast track-switching
Giacomo Lozito <james@develia.org>
parents:
3259
diff
changeset
|
235 the 'playback safe state' before stopping */ |
d4f6507cded3
added a system that allows input plugins to signal to the core (actually, they MUST do it) that they're ready for playback and it's safe to call their stop function; this fixes a nasty race condition that triggered on fast track-switching
Giacomo Lozito <james@develia.org>
parents:
3259
diff
changeset
|
236 playback_wait_for_pb_ready(playback); |
d4f6507cded3
added a system that allows input plugins to signal to the core (actually, they MUST do it) that they're ready for playback and it's safe to call their stop function; this fixes a nasty race condition that triggered on fast track-switching
Giacomo Lozito <james@develia.org>
parents:
3259
diff
changeset
|
237 |
3170
603577228518
get_current_input_playback() cleanups.
William Pitcock <nenolod@atheme-project.org>
parents:
3168
diff
changeset
|
238 if (playback_get_paused() == TRUE) |
603577228518
get_current_input_playback() cleanups.
William Pitcock <nenolod@atheme-project.org>
parents:
3168
diff
changeset
|
239 { |
3258
d899694663a7
in playback_stop, do not assume that get_written_time will be always > 0, some plugins do not write to output at all
Giacomo Lozito <james@develia.org>
parents:
3253
diff
changeset
|
240 if (get_written_time() > 0) |
d899694663a7
in playback_stop, do not assume that get_written_time will be always > 0, some plugins do not write to output at all
Giacomo Lozito <james@develia.org>
parents:
3253
diff
changeset
|
241 output_flush(get_written_time()); /* to avoid noise */ |
2313 | 242 playback_pause(); |
243 } | |
244 | |
3319
d4f6507cded3
added a system that allows input plugins to signal to the core (actually, they MUST do it) that they're ready for playback and it's safe to call their stop function; this fixes a nasty race condition that triggered on fast track-switching
Giacomo Lozito <james@develia.org>
parents:
3259
diff
changeset
|
245 ip_data.playing = FALSE; |
2313 | 246 |
3696
418ac922ce87
Use a mutex/condvar/timed wait to allow tickless operation in the output loop.
William Pitcock <nenolod@atheme.org>
parents:
3677
diff
changeset
|
247 /* TODO: i'm unsure if this will work. we might have to |
418ac922ce87
Use a mutex/condvar/timed wait to allow tickless operation in the output loop.
William Pitcock <nenolod@atheme.org>
parents:
3677
diff
changeset
|
248 signal the change in stop() (e.g. in the plugins |
418ac922ce87
Use a mutex/condvar/timed wait to allow tickless operation in the output loop.
William Pitcock <nenolod@atheme.org>
parents:
3677
diff
changeset
|
249 directly.) --nenolod */ |
418ac922ce87
Use a mutex/condvar/timed wait to allow tickless operation in the output loop.
William Pitcock <nenolod@atheme.org>
parents:
3677
diff
changeset
|
250 playback->set_pb_change(playback); |
418ac922ce87
Use a mutex/condvar/timed wait to allow tickless operation in the output loop.
William Pitcock <nenolod@atheme.org>
parents:
3677
diff
changeset
|
251 |
3170
603577228518
get_current_input_playback() cleanups.
William Pitcock <nenolod@atheme-project.org>
parents:
3168
diff
changeset
|
252 if (playback->plugin->stop) |
4359
0becb809bdc9
moved most GUI-related functions from playback.c to ui_main_evlisteners.c
mf0102 <0102@gmx.at>
parents:
4346
diff
changeset
|
253 { |
0becb809bdc9
moved most GUI-related functions from playback.c to ui_main_evlisteners.c
mf0102 <0102@gmx.at>
parents:
4346
diff
changeset
|
254 plugin_set_current((Plugin *)(playback->plugin)); |
3170
603577228518
get_current_input_playback() cleanups.
William Pitcock <nenolod@atheme-project.org>
parents:
3168
diff
changeset
|
255 playback->plugin->stop(playback); |
4359
0becb809bdc9
moved most GUI-related functions from playback.c to ui_main_evlisteners.c
mf0102 <0102@gmx.at>
parents:
4346
diff
changeset
|
256 } |
2313 | 257 |
3181
1596dcb77acd
Track playback monitor thread in InputPlayback.thread.
William Pitcock <nenolod@atheme-project.org>
parents:
3170
diff
changeset
|
258 if (playback->thread != NULL) |
3326
6dbb73b8e28c
thread sanity checks
William Pitcock <nenolod@atheme-project.org>
parents:
3325
diff
changeset
|
259 { |
3181
1596dcb77acd
Track playback monitor thread in InputPlayback.thread.
William Pitcock <nenolod@atheme-project.org>
parents:
3170
diff
changeset
|
260 g_thread_join(playback->thread); |
3326
6dbb73b8e28c
thread sanity checks
William Pitcock <nenolod@atheme-project.org>
parents:
3325
diff
changeset
|
261 playback->thread = NULL; |
6dbb73b8e28c
thread sanity checks
William Pitcock <nenolod@atheme-project.org>
parents:
3325
diff
changeset
|
262 } |
3181
1596dcb77acd
Track playback monitor thread in InputPlayback.thread.
William Pitcock <nenolod@atheme-project.org>
parents:
3170
diff
changeset
|
263 |
2313 | 264 ip_data.paused = FALSE; |
265 | |
4109
2d6fd3f630f0
Adds playback_free() function to fix memory leak in playback_stop(). (Bugzilla #42)
Jussi Judin <jjudin+audacious@iki.fi>
parents:
3926
diff
changeset
|
266 playback_free(playback); |
3319
d4f6507cded3
added a system that allows input plugins to signal to the core (actually, they MUST do it) that they're ready for playback and it's safe to call their stop function; this fixes a nasty race condition that triggered on fast track-switching
Giacomo Lozito <james@develia.org>
parents:
3259
diff
changeset
|
267 set_current_input_playback(NULL); |
3346
71d8d93f1bad
Implemented TrackChange, StatusChange signals, with a stub for CapsChange.
Ben Tucker <ben.tucker@gmail.com>
parents:
3326
diff
changeset
|
268 #ifdef USE_DBUS |
71d8d93f1bad
Implemented TrackChange, StatusChange signals, with a stub for CapsChange.
Ben Tucker <ben.tucker@gmail.com>
parents:
3326
diff
changeset
|
269 mpris_emit_status_change(mpris, MPRIS_STATUS_STOP); |
71d8d93f1bad
Implemented TrackChange, StatusChange signals, with a stub for CapsChange.
Ben Tucker <ben.tucker@gmail.com>
parents:
3326
diff
changeset
|
270 #endif |
2313 | 271 } |
272 | |
273 ip_data.playing = FALSE; | |
3018
6a9fdd5aee3a
Move timer updates out of the 100hz giant loop.
Daniel Drake <dsd@gentoo.org>
parents:
3001
diff
changeset
|
274 |
4359
0becb809bdc9
moved most GUI-related functions from playback.c to ui_main_evlisteners.c
mf0102 <0102@gmx.at>
parents:
4346
diff
changeset
|
275 hook_call("playback stop", NULL); |
2313 | 276 } |
277 | |
278 static void | |
279 run_no_output_plugin_dialog(void) | |
280 { | |
281 const gchar *markup = | |
282 N_("<b><big>No output plugin selected.</big></b>\n" | |
283 "You have not selected an output plugin."); | |
284 | |
285 GtkWidget *dialog = | |
286 gtk_message_dialog_new_with_markup(GTK_WINDOW(mainwin), | |
287 GTK_DIALOG_DESTROY_WITH_PARENT, | |
288 GTK_MESSAGE_ERROR, | |
289 GTK_BUTTONS_OK, | |
290 _(markup)); | |
291 gtk_dialog_run(GTK_DIALOG(dialog)); | |
292 gtk_widget_destroy(dialog); | |
293 } | |
294 | |
3153
e0a2ea93f98f
New threading model for playback. Playback code should now *block*.
William Pitcock <nenolod@atheme-project.org>
parents:
3152
diff
changeset
|
295 static gpointer |
3154
732cfad87116
Made a mistake here. Fixing!
William Pitcock <nenolod@atheme-project.org>
parents:
3153
diff
changeset
|
296 playback_monitor_thread(gpointer data) |
3153
e0a2ea93f98f
New threading model for playback. Playback code should now *block*.
William Pitcock <nenolod@atheme-project.org>
parents:
3152
diff
changeset
|
297 { |
3253
6374d66ee623
proper race condition fix
William Pitcock <nenolod@atheme-project.org>
parents:
3252
diff
changeset
|
298 InputPlayback *playback = (InputPlayback *) data; |
3153
e0a2ea93f98f
New threading model for playback. Playback code should now *block*.
William Pitcock <nenolod@atheme-project.org>
parents:
3152
diff
changeset
|
299 |
4266
2b7a74fce100
Implemented support for multiple subplugins inside a plugin (see bug #148) and PluginHeader finalization
stefano@zanga
parents:
4235
diff
changeset
|
300 plugin_set_current((Plugin *)(playback->plugin)); |
3253
6374d66ee623
proper race condition fix
William Pitcock <nenolod@atheme-project.org>
parents:
3252
diff
changeset
|
301 playback->plugin->play_file(playback); |
3153
e0a2ea93f98f
New threading model for playback. Playback code should now *block*.
William Pitcock <nenolod@atheme-project.org>
parents:
3152
diff
changeset
|
302 |
3319
d4f6507cded3
added a system that allows input plugins to signal to the core (actually, they MUST do it) that they're ready for playback and it's safe to call their stop function; this fixes a nasty race condition that triggered on fast track-switching
Giacomo Lozito <james@develia.org>
parents:
3259
diff
changeset
|
303 /* if play_file has not reached the 'safe state' before returning (an error |
d4f6507cded3
added a system that allows input plugins to signal to the core (actually, they MUST do it) that they're ready for playback and it's safe to call their stop function; this fixes a nasty race condition that triggered on fast track-switching
Giacomo Lozito <james@develia.org>
parents:
3259
diff
changeset
|
304 occurred), set the playback ready value to 1 now, to allow for proper stop */ |
d4f6507cded3
added a system that allows input plugins to signal to the core (actually, they MUST do it) that they're ready for playback and it's safe to call their stop function; this fixes a nasty race condition that triggered on fast track-switching
Giacomo Lozito <james@develia.org>
parents:
3259
diff
changeset
|
305 playback_set_pb_ready(playback); |
d4f6507cded3
added a system that allows input plugins to signal to the core (actually, they MUST do it) that they're ready for playback and it's safe to call their stop function; this fixes a nasty race condition that triggered on fast track-switching
Giacomo Lozito <james@develia.org>
parents:
3259
diff
changeset
|
306 |
3158
92717dcb09f6
Send a message from the monitor thread to the main thread for audio errors, like we do with eof condition.
William Pitcock <nenolod@atheme-project.org>
parents:
3156
diff
changeset
|
307 if (!playback->error && ip_data.playing) |
3156
4a0e216bc825
playback monitor thread: If forced stop occurs, do not queue "playback eof" signal.
William Pitcock <nenolod@atheme-project.org>
parents:
3155
diff
changeset
|
308 playback_eof(); |
3158
92717dcb09f6
Send a message from the monitor thread to the main thread for audio errors, like we do with eof condition.
William Pitcock <nenolod@atheme-project.org>
parents:
3156
diff
changeset
|
309 else if (playback->error) |
92717dcb09f6
Send a message from the monitor thread to the main thread for audio errors, like we do with eof condition.
William Pitcock <nenolod@atheme-project.org>
parents:
3156
diff
changeset
|
310 playback_error(); |
3153
e0a2ea93f98f
New threading model for playback. Playback code should now *block*.
William Pitcock <nenolod@atheme-project.org>
parents:
3152
diff
changeset
|
311 |
3181
1596dcb77acd
Track playback monitor thread in InputPlayback.thread.
William Pitcock <nenolod@atheme-project.org>
parents:
3170
diff
changeset
|
312 playback->thread = NULL; |
1596dcb77acd
Track playback monitor thread in InputPlayback.thread.
William Pitcock <nenolod@atheme-project.org>
parents:
3170
diff
changeset
|
313 g_thread_exit(NULL); |
3153
e0a2ea93f98f
New threading model for playback. Playback code should now *block*.
William Pitcock <nenolod@atheme-project.org>
parents:
3152
diff
changeset
|
314 return NULL; |
e0a2ea93f98f
New threading model for playback. Playback code should now *block*.
William Pitcock <nenolod@atheme-project.org>
parents:
3152
diff
changeset
|
315 } |
e0a2ea93f98f
New threading model for playback. Playback code should now *block*.
William Pitcock <nenolod@atheme-project.org>
parents:
3152
diff
changeset
|
316 |
3710
602002306969
generic playback control API
William Pitcock <nenolod@atheme.org>
parents:
3709
diff
changeset
|
317 InputPlayback * |
602002306969
generic playback control API
William Pitcock <nenolod@atheme.org>
parents:
3709
diff
changeset
|
318 playback_new(void) |
602002306969
generic playback control API
William Pitcock <nenolod@atheme.org>
parents:
3709
diff
changeset
|
319 { |
3711 | 320 InputPlayback *playback = (InputPlayback *) g_slice_new0(InputPlayback); |
3710
602002306969
generic playback control API
William Pitcock <nenolod@atheme.org>
parents:
3709
diff
changeset
|
321 |
602002306969
generic playback control API
William Pitcock <nenolod@atheme.org>
parents:
3709
diff
changeset
|
322 playback->pb_ready_mutex = g_mutex_new(); |
602002306969
generic playback control API
William Pitcock <nenolod@atheme.org>
parents:
3709
diff
changeset
|
323 playback->pb_ready_cond = g_cond_new(); |
602002306969
generic playback control API
William Pitcock <nenolod@atheme.org>
parents:
3709
diff
changeset
|
324 playback->pb_ready_val = 0; |
602002306969
generic playback control API
William Pitcock <nenolod@atheme.org>
parents:
3709
diff
changeset
|
325 |
602002306969
generic playback control API
William Pitcock <nenolod@atheme.org>
parents:
3709
diff
changeset
|
326 playback->pb_change_mutex = g_mutex_new(); |
602002306969
generic playback control API
William Pitcock <nenolod@atheme.org>
parents:
3709
diff
changeset
|
327 playback->pb_change_cond = g_cond_new(); |
602002306969
generic playback control API
William Pitcock <nenolod@atheme.org>
parents:
3709
diff
changeset
|
328 |
602002306969
generic playback control API
William Pitcock <nenolod@atheme.org>
parents:
3709
diff
changeset
|
329 /* init vtable functors */ |
602002306969
generic playback control API
William Pitcock <nenolod@atheme.org>
parents:
3709
diff
changeset
|
330 playback->set_pb_ready = playback_set_pb_ready; |
602002306969
generic playback control API
William Pitcock <nenolod@atheme.org>
parents:
3709
diff
changeset
|
331 playback->set_pb_change = playback_set_pb_change; |
602002306969
generic playback control API
William Pitcock <nenolod@atheme.org>
parents:
3709
diff
changeset
|
332 playback->set_params = playback_set_pb_params; |
602002306969
generic playback control API
William Pitcock <nenolod@atheme.org>
parents:
3709
diff
changeset
|
333 playback->set_title = playback_set_pb_title; |
602002306969
generic playback control API
William Pitcock <nenolod@atheme.org>
parents:
3709
diff
changeset
|
334 playback->pass_audio = output_pass_audio; |
4235
2d4b4f13d10d
set_replaygain_info added to PAPI
Eugene Zagidullin <e.asphyx@gmail.com>
parents:
4109
diff
changeset
|
335 playback->set_replaygain_info = output_set_replaygain_info; |
3710
602002306969
generic playback control API
William Pitcock <nenolod@atheme.org>
parents:
3709
diff
changeset
|
336 |
602002306969
generic playback control API
William Pitcock <nenolod@atheme.org>
parents:
3709
diff
changeset
|
337 return playback; |
602002306969
generic playback control API
William Pitcock <nenolod@atheme.org>
parents:
3709
diff
changeset
|
338 } |
602002306969
generic playback control API
William Pitcock <nenolod@atheme.org>
parents:
3709
diff
changeset
|
339 |
4109
2d6fd3f630f0
Adds playback_free() function to fix memory leak in playback_stop(). (Bugzilla #42)
Jussi Judin <jjudin+audacious@iki.fi>
parents:
3926
diff
changeset
|
340 /** |
2d6fd3f630f0
Adds playback_free() function to fix memory leak in playback_stop(). (Bugzilla #42)
Jussi Judin <jjudin+audacious@iki.fi>
parents:
3926
diff
changeset
|
341 * Destroys InputPlayback. |
2d6fd3f630f0
Adds playback_free() function to fix memory leak in playback_stop(). (Bugzilla #42)
Jussi Judin <jjudin+audacious@iki.fi>
parents:
3926
diff
changeset
|
342 * |
2d6fd3f630f0
Adds playback_free() function to fix memory leak in playback_stop(). (Bugzilla #42)
Jussi Judin <jjudin+audacious@iki.fi>
parents:
3926
diff
changeset
|
343 * Playback comes from playback_new() function but there can be also |
2d6fd3f630f0
Adds playback_free() function to fix memory leak in playback_stop(). (Bugzilla #42)
Jussi Judin <jjudin+audacious@iki.fi>
parents:
3926
diff
changeset
|
344 * other sources for allocated playback data (like filename and title) |
2d6fd3f630f0
Adds playback_free() function to fix memory leak in playback_stop(). (Bugzilla #42)
Jussi Judin <jjudin+audacious@iki.fi>
parents:
3926
diff
changeset
|
345 * and this tries to deallocate all that data. |
2d6fd3f630f0
Adds playback_free() function to fix memory leak in playback_stop(). (Bugzilla #42)
Jussi Judin <jjudin+audacious@iki.fi>
parents:
3926
diff
changeset
|
346 */ |
2d6fd3f630f0
Adds playback_free() function to fix memory leak in playback_stop(). (Bugzilla #42)
Jussi Judin <jjudin+audacious@iki.fi>
parents:
3926
diff
changeset
|
347 void playback_free(InputPlayback *playback) |
2d6fd3f630f0
Adds playback_free() function to fix memory leak in playback_stop(). (Bugzilla #42)
Jussi Judin <jjudin+audacious@iki.fi>
parents:
3926
diff
changeset
|
348 { |
2d6fd3f630f0
Adds playback_free() function to fix memory leak in playback_stop(). (Bugzilla #42)
Jussi Judin <jjudin+audacious@iki.fi>
parents:
3926
diff
changeset
|
349 g_free(playback->filename); |
2d6fd3f630f0
Adds playback_free() function to fix memory leak in playback_stop(). (Bugzilla #42)
Jussi Judin <jjudin+audacious@iki.fi>
parents:
3926
diff
changeset
|
350 g_free(playback->title); |
2d6fd3f630f0
Adds playback_free() function to fix memory leak in playback_stop(). (Bugzilla #42)
Jussi Judin <jjudin+audacious@iki.fi>
parents:
3926
diff
changeset
|
351 |
2d6fd3f630f0
Adds playback_free() function to fix memory leak in playback_stop(). (Bugzilla #42)
Jussi Judin <jjudin+audacious@iki.fi>
parents:
3926
diff
changeset
|
352 g_mutex_free(playback->pb_ready_mutex); |
2d6fd3f630f0
Adds playback_free() function to fix memory leak in playback_stop(). (Bugzilla #42)
Jussi Judin <jjudin+audacious@iki.fi>
parents:
3926
diff
changeset
|
353 g_cond_free(playback->pb_ready_cond); |
2d6fd3f630f0
Adds playback_free() function to fix memory leak in playback_stop(). (Bugzilla #42)
Jussi Judin <jjudin+audacious@iki.fi>
parents:
3926
diff
changeset
|
354 |
2d6fd3f630f0
Adds playback_free() function to fix memory leak in playback_stop(). (Bugzilla #42)
Jussi Judin <jjudin+audacious@iki.fi>
parents:
3926
diff
changeset
|
355 g_mutex_free(playback->pb_change_mutex); |
2d6fd3f630f0
Adds playback_free() function to fix memory leak in playback_stop(). (Bugzilla #42)
Jussi Judin <jjudin+audacious@iki.fi>
parents:
3926
diff
changeset
|
356 g_cond_free(playback->pb_change_cond); |
2d6fd3f630f0
Adds playback_free() function to fix memory leak in playback_stop(). (Bugzilla #42)
Jussi Judin <jjudin+audacious@iki.fi>
parents:
3926
diff
changeset
|
357 |
2d6fd3f630f0
Adds playback_free() function to fix memory leak in playback_stop(). (Bugzilla #42)
Jussi Judin <jjudin+audacious@iki.fi>
parents:
3926
diff
changeset
|
358 g_slice_free(InputPlayback, playback); |
2d6fd3f630f0
Adds playback_free() function to fix memory leak in playback_stop(). (Bugzilla #42)
Jussi Judin <jjudin+audacious@iki.fi>
parents:
3926
diff
changeset
|
359 } |
2d6fd3f630f0
Adds playback_free() function to fix memory leak in playback_stop(). (Bugzilla #42)
Jussi Judin <jjudin+audacious@iki.fi>
parents:
3926
diff
changeset
|
360 |
3710
602002306969
generic playback control API
William Pitcock <nenolod@atheme.org>
parents:
3709
diff
changeset
|
361 void |
602002306969
generic playback control API
William Pitcock <nenolod@atheme.org>
parents:
3709
diff
changeset
|
362 playback_run(InputPlayback *playback) |
602002306969
generic playback control API
William Pitcock <nenolod@atheme.org>
parents:
3709
diff
changeset
|
363 { |
602002306969
generic playback control API
William Pitcock <nenolod@atheme.org>
parents:
3709
diff
changeset
|
364 playback->thread = g_thread_create(playback_monitor_thread, playback, TRUE, NULL); |
602002306969
generic playback control API
William Pitcock <nenolod@atheme.org>
parents:
3709
diff
changeset
|
365 } |
602002306969
generic playback control API
William Pitcock <nenolod@atheme.org>
parents:
3709
diff
changeset
|
366 |
2313 | 367 gboolean |
368 playback_play_file(PlaylistEntry *entry) | |
369 { | |
3254 | 370 InputPlayback *playback; |
371 | |
2313 | 372 g_return_val_if_fail(entry != NULL, FALSE); |
373 | |
374 if (!get_current_output_plugin()) { | |
375 run_no_output_plugin_dialog(); | |
376 mainwin_stop_pushed(); | |
377 return FALSE; | |
378 } | |
379 | |
3127
c92070f10148
Use ProbeResult (try 1)
William Pitcock <nenolod@atheme-project.org>
parents:
3123
diff
changeset
|
380 if (!entry->decoder) |
c92070f10148
Use ProbeResult (try 1)
William Pitcock <nenolod@atheme-project.org>
parents:
3123
diff
changeset
|
381 { |
c92070f10148
Use ProbeResult (try 1)
William Pitcock <nenolod@atheme-project.org>
parents:
3123
diff
changeset
|
382 ProbeResult *pr = input_check_file(entry->filename, FALSE); |
c92070f10148
Use ProbeResult (try 1)
William Pitcock <nenolod@atheme-project.org>
parents:
3123
diff
changeset
|
383 |
c92070f10148
Use ProbeResult (try 1)
William Pitcock <nenolod@atheme-project.org>
parents:
3123
diff
changeset
|
384 if (pr != NULL) |
c92070f10148
Use ProbeResult (try 1)
William Pitcock <nenolod@atheme-project.org>
parents:
3123
diff
changeset
|
385 { |
c92070f10148
Use ProbeResult (try 1)
William Pitcock <nenolod@atheme-project.org>
parents:
3123
diff
changeset
|
386 entry->decoder = pr->ip; |
c92070f10148
Use ProbeResult (try 1)
William Pitcock <nenolod@atheme-project.org>
parents:
3123
diff
changeset
|
387 entry->tuple = pr->tuple; |
c92070f10148
Use ProbeResult (try 1)
William Pitcock <nenolod@atheme-project.org>
parents:
3123
diff
changeset
|
388 |
c92070f10148
Use ProbeResult (try 1)
William Pitcock <nenolod@atheme-project.org>
parents:
3123
diff
changeset
|
389 g_free(pr); |
c92070f10148
Use ProbeResult (try 1)
William Pitcock <nenolod@atheme-project.org>
parents:
3123
diff
changeset
|
390 } |
4530
d2fd41d3964e
Stop playback (instead of doing endless loop) when file can't be read
Tomasz Mon <desowin@gmail.com>
parents:
4505
diff
changeset
|
391 else |
d2fd41d3964e
Stop playback (instead of doing endless loop) when file can't be read
Tomasz Mon <desowin@gmail.com>
parents:
4505
diff
changeset
|
392 { |
d2fd41d3964e
Stop playback (instead of doing endless loop) when file can't be read
Tomasz Mon <desowin@gmail.com>
parents:
4505
diff
changeset
|
393 mainwin_stop_pushed(); |
d2fd41d3964e
Stop playback (instead of doing endless loop) when file can't be read
Tomasz Mon <desowin@gmail.com>
parents:
4505
diff
changeset
|
394 return FALSE; |
d2fd41d3964e
Stop playback (instead of doing endless loop) when file can't be read
Tomasz Mon <desowin@gmail.com>
parents:
4505
diff
changeset
|
395 } |
3127
c92070f10148
Use ProbeResult (try 1)
William Pitcock <nenolod@atheme-project.org>
parents:
3123
diff
changeset
|
396 } |
c92070f10148
Use ProbeResult (try 1)
William Pitcock <nenolod@atheme-project.org>
parents:
3123
diff
changeset
|
397 |
3437
3092a8b3fe34
Big plugin system changes (part 1 of who knows, it's still a big mess):
William Pitcock <nenolod@atheme.org>
parents:
3348
diff
changeset
|
398 if (!entry->decoder || !entry->decoder->enabled) |
2313 | 399 { |
2436
f346d30bf5ab
[svn] Change the input plugin API to use a struct for the currently-playing file.
iabervon
parents:
2420
diff
changeset
|
400 set_current_input_playback(NULL); |
2313 | 401 |
402 return FALSE; | |
403 } | |
404 | |
3092
1ddeb9f068ab
Backed out changeset b87335249c69d45d253b1b960a9ec7f60b68e5a5
William Pitcock <nenolod@atheme-project.org>
parents:
3089
diff
changeset
|
405 ip_data.playing = TRUE; |
3253
6374d66ee623
proper race condition fix
William Pitcock <nenolod@atheme-project.org>
parents:
3252
diff
changeset
|
406 |
3710
602002306969
generic playback control API
William Pitcock <nenolod@atheme.org>
parents:
3709
diff
changeset
|
407 playback = playback_new(); |
3253
6374d66ee623
proper race condition fix
William Pitcock <nenolod@atheme-project.org>
parents:
3252
diff
changeset
|
408 |
6374d66ee623
proper race condition fix
William Pitcock <nenolod@atheme-project.org>
parents:
3252
diff
changeset
|
409 entry->decoder->output = &psuedo_output_plugin; |
6374d66ee623
proper race condition fix
William Pitcock <nenolod@atheme-project.org>
parents:
3252
diff
changeset
|
410 |
6374d66ee623
proper race condition fix
William Pitcock <nenolod@atheme-project.org>
parents:
3252
diff
changeset
|
411 playback->plugin = entry->decoder; |
3710
602002306969
generic playback control API
William Pitcock <nenolod@atheme.org>
parents:
3709
diff
changeset
|
412 playback->filename = g_strdup(entry->filename); |
3253
6374d66ee623
proper race condition fix
William Pitcock <nenolod@atheme-project.org>
parents:
3252
diff
changeset
|
413 playback->output = &psuedo_output_plugin; |
6374d66ee623
proper race condition fix
William Pitcock <nenolod@atheme-project.org>
parents:
3252
diff
changeset
|
414 |
6374d66ee623
proper race condition fix
William Pitcock <nenolod@atheme-project.org>
parents:
3252
diff
changeset
|
415 set_current_input_playback(playback); |
6374d66ee623
proper race condition fix
William Pitcock <nenolod@atheme-project.org>
parents:
3252
diff
changeset
|
416 |
3710
602002306969
generic playback control API
William Pitcock <nenolod@atheme.org>
parents:
3709
diff
changeset
|
417 playback_run(playback); |
602002306969
generic playback control API
William Pitcock <nenolod@atheme.org>
parents:
3709
diff
changeset
|
418 |
3346
71d8d93f1bad
Implemented TrackChange, StatusChange signals, with a stub for CapsChange.
Ben Tucker <ben.tucker@gmail.com>
parents:
3326
diff
changeset
|
419 #ifdef USE_DBUS |
71d8d93f1bad
Implemented TrackChange, StatusChange signals, with a stub for CapsChange.
Ben Tucker <ben.tucker@gmail.com>
parents:
3326
diff
changeset
|
420 mpris_emit_status_change(mpris, MPRIS_STATUS_PLAY); |
71d8d93f1bad
Implemented TrackChange, StatusChange signals, with a stub for CapsChange.
Ben Tucker <ben.tucker@gmail.com>
parents:
3326
diff
changeset
|
421 #endif |
2313 | 422 |
4359
0becb809bdc9
moved most GUI-related functions from playback.c to ui_main_evlisteners.c
mf0102 <0102@gmx.at>
parents:
4346
diff
changeset
|
423 hook_call("playback play file", NULL); |
0becb809bdc9
moved most GUI-related functions from playback.c to ui_main_evlisteners.c
mf0102 <0102@gmx.at>
parents:
4346
diff
changeset
|
424 |
2313 | 425 return TRUE; |
426 } | |
427 | |
428 gboolean | |
429 playback_get_playing(void) | |
430 { | |
431 return ip_data.playing; | |
432 } | |
433 | |
434 gboolean | |
435 playback_get_paused(void) | |
436 { | |
437 return ip_data.paused; | |
438 } | |
439 | |
440 void | |
441 playback_seek(gint time) | |
442 { | |
3168
ee8a1ed30826
playback_seek(): several WTFs in here (probably from XMMS) fixed
William Pitcock <nenolod@atheme-project.org>
parents:
3165
diff
changeset
|
443 InputPlayback *playback = get_current_input_playback(); |
2313 | 444 gboolean restore_pause = FALSE; |
445 gint l=0, r=0; | |
446 | |
2420 | 447 g_return_if_fail(ip_data.playing); |
3168
ee8a1ed30826
playback_seek(): several WTFs in here (probably from XMMS) fixed
William Pitcock <nenolod@atheme-project.org>
parents:
3165
diff
changeset
|
448 g_return_if_fail(playback != NULL); |
2313 | 449 |
450 /* FIXME WORKAROUND...that should work with all plugins | |
451 * mute the volume, start playback again, do the seek, then pause again | |
452 * -Patrick Sudowe | |
453 */ | |
2420 | 454 if (ip_data.paused) |
2313 | 455 { |
2420 | 456 restore_pause = TRUE; |
457 output_get_volume(&l, &r); | |
458 output_set_volume(0,0); | |
459 playback_pause(); | |
2313 | 460 } |
461 | |
4266
2b7a74fce100
Implemented support for multiple subplugins inside a plugin (see bug #148) and PluginHeader finalization
stefano@zanga
parents:
4235
diff
changeset
|
462 plugin_set_current((Plugin *)(playback->plugin)); |
3168
ee8a1ed30826
playback_seek(): several WTFs in here (probably from XMMS) fixed
William Pitcock <nenolod@atheme-project.org>
parents:
3165
diff
changeset
|
463 playback->plugin->seek(playback, time); |
3696
418ac922ce87
Use a mutex/condvar/timed wait to allow tickless operation in the output loop.
William Pitcock <nenolod@atheme.org>
parents:
3677
diff
changeset
|
464 playback->set_pb_change(playback); |
2313 | 465 |
2420 | 466 if (restore_pause) |
2313 | 467 { |
2420 | 468 playback_pause(); |
469 output_set_volume(l, r); | |
2313 | 470 } |
3718
a98b1189777b
add new hook, playback seek, and subscribe mainwin_update_song_info() to it.
William Pitcock <nenolod@atheme.org>
parents:
3717
diff
changeset
|
471 |
3722 | 472 event_queue_timed(100, "playback seek", playback); |
2313 | 473 } |
474 | |
475 void | |
476 playback_seek_relative(gint offset) | |
477 { | |
478 gint time = CLAMP(playback_get_time() / 1000 + offset, | |
479 0, playlist_get_current_length(playlist_get_active()) / 1000 - 1); | |
480 playback_seek(time); | |
481 } | |
4505 | 482 |
483 void | |
484 playback_get_sample_params(gint * bitrate, | |
485 gint * frequency, | |
486 gint * n_channels) | |
487 { | |
488 if (bitrate) | |
489 *bitrate = playback_info.bitrate; | |
490 | |
491 if (frequency) | |
492 *frequency = playback_info.frequency; | |
493 | |
494 if (n_channels) | |
495 *n_channels = playback_info.n_channels; | |
496 } | |
497 | |
498 void | |
499 playback_set_sample_params(gint bitrate, | |
500 gint frequency, | |
501 gint n_channels) | |
502 { | |
503 if (bitrate >= 0) | |
504 playback_info.bitrate = bitrate; | |
505 | |
506 if (frequency >= 0) | |
507 playback_info.frequency = frequency; | |
508 | |
509 if (n_channels >= 0) | |
510 playback_info.n_channels = n_channels; | |
511 } |