core/audio: Rework audio message handling
Let's just do everything inline and cut out the extra function calls to make the code simpler. I also created functions to help tests send EOS or error messages. Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
parent
4986bdad13
commit
e6f34d34f0
102
core/audio.c
102
core/audio.c
|
@ -73,15 +73,46 @@ static void __audio_pad_added(GstElement *element, GstPad *pad, gpointer data)
|
||||||
|
|
||||||
static gboolean __audio_message(GstBus *bus, GstMessage *message, gpointer data)
|
static gboolean __audio_message(GstBus *bus, GstMessage *message, gpointer data)
|
||||||
{
|
{
|
||||||
|
GstObject *source = GST_OBJECT(GST_MESSAGE_SRC(message));
|
||||||
|
gchar *debug = NULL;
|
||||||
|
GError *error = NULL;
|
||||||
|
GstState old, state, next;
|
||||||
|
unsigned int load_flags = LOAD_DEFAULT;
|
||||||
|
|
||||||
switch (GST_MESSAGE_TYPE(message)) {
|
switch (GST_MESSAGE_TYPE(message)) {
|
||||||
case GST_MESSAGE_ERROR:
|
case GST_MESSAGE_ERROR:
|
||||||
audio_error(message);
|
gst_message_parse_error(message, &error, &debug);
|
||||||
|
g_printerr("ERROR from element %s: %s\n",
|
||||||
|
GST_OBJECT_NAME(source), error->message);
|
||||||
|
g_printerr("DEBUG details: %s\n", debug ? debug : "none");
|
||||||
|
g_error_free(error);
|
||||||
|
g_free(debug);
|
||||||
|
|
||||||
|
if (audio_cur_state() != GST_STATE_PLAYING)
|
||||||
|
load_flags = LOAD_HISTORY;
|
||||||
|
__audio_load(playlist_next(), load_flags);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GST_MESSAGE_EOS:
|
case GST_MESSAGE_EOS:
|
||||||
audio_eos();
|
track_played(audio_track);
|
||||||
|
if (audio_pause_count >= 0) {
|
||||||
|
audio_pause_after(audio_pause_count - 1);
|
||||||
|
if (audio_pause_count == -1)
|
||||||
|
load_flags = LOAD_HISTORY;
|
||||||
|
}
|
||||||
|
__audio_load(playlist_next(), load_flags);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GST_MESSAGE_STATE_CHANGED:
|
case GST_MESSAGE_STATE_CHANGED:
|
||||||
audio_state_changed(message);
|
if (!audio_cb || source != GST_OBJECT(audio_pipeline))
|
||||||
|
break;
|
||||||
|
|
||||||
|
gst_message_parse_state_changed(message, &old, &state, &next);
|
||||||
|
if (state == GST_STATE_PLAYING || state == GST_STATE_PAUSED) {
|
||||||
|
if (next == GST_STATE_VOID_PENDING)
|
||||||
|
audio_cb->audio_cb_state_change(state);
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -258,56 +289,6 @@ struct track *audio_prev()
|
||||||
return __audio_load(playlist_prev(), LOAD_PLAYING);
|
return __audio_load(playlist_prev(), LOAD_PLAYING);
|
||||||
}
|
}
|
||||||
|
|
||||||
void audio_state_changed(GstMessage *message)
|
|
||||||
{
|
|
||||||
GstElement *src = GST_ELEMENT(GST_MESSAGE_SRC(message));
|
|
||||||
GstState old, state, next;
|
|
||||||
|
|
||||||
if (!audio_cb || src != audio_pipeline)
|
|
||||||
return;
|
|
||||||
|
|
||||||
gst_message_parse_state_changed(message, &old, &state, &next);
|
|
||||||
if (next != GST_STATE_VOID_PENDING)
|
|
||||||
return;
|
|
||||||
if (state == GST_STATE_PLAYING || state == GST_STATE_PAUSED)
|
|
||||||
audio_cb->audio_cb_state_change(state);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct track *audio_eos()
|
|
||||||
{
|
|
||||||
/* Mark current track as played */
|
|
||||||
if (audio_track)
|
|
||||||
track_played(audio_track);
|
|
||||||
|
|
||||||
/* Check pause count and pick the next track */
|
|
||||||
if (audio_pause_count >= 0)
|
|
||||||
audio_pause_after(audio_pause_count - 1);
|
|
||||||
return __audio_load(playlist_next(), audio_pause_count != -1 ?
|
|
||||||
LOAD_DEFAULT : LOAD_HISTORY);
|
|
||||||
}
|
|
||||||
|
|
||||||
void audio_error(GstMessage *error)
|
|
||||||
{
|
|
||||||
gchar *path = NULL, *debug = NULL;
|
|
||||||
GError *err = NULL;
|
|
||||||
|
|
||||||
if (audio_track)
|
|
||||||
path = track_path(audio_track);
|
|
||||||
if (error)
|
|
||||||
gst_message_parse_error(error, &err, &debug);
|
|
||||||
|
|
||||||
g_print("Error: %s (%s)\n", err->message, path);
|
|
||||||
if (debug)
|
|
||||||
g_print("Debug details: %s\n", debug);
|
|
||||||
|
|
||||||
__audio_load(playlist_next(), audio_cur_state() == GST_STATE_PLAYING ?
|
|
||||||
LOAD_DEFAULT : LOAD_HISTORY);
|
|
||||||
|
|
||||||
g_error_free(err);
|
|
||||||
g_free(debug);
|
|
||||||
g_free(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
void audio_pause_after(int n)
|
void audio_pause_after(int n)
|
||||||
{
|
{
|
||||||
if (n != audio_pause_count) {
|
if (n != audio_pause_count) {
|
||||||
|
@ -318,6 +299,21 @@ void audio_pause_after(int n)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_TESTING
|
#ifdef CONFIG_TESTING
|
||||||
|
void test_audio_eos()
|
||||||
|
{
|
||||||
|
GstMessage *message = gst_message_new_eos(GST_OBJECT(audio_pipeline));
|
||||||
|
__audio_message(NULL, message, NULL);
|
||||||
|
gst_message_unref(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_audio_error(GError *error, gchar *debug)
|
||||||
|
{
|
||||||
|
GstMessage *message = gst_message_new_error(
|
||||||
|
GST_OBJECT(audio_pipeline), error, debug);
|
||||||
|
__audio_message(NULL, message, NULL);
|
||||||
|
gst_message_unref(message);
|
||||||
|
}
|
||||||
|
|
||||||
GstElement *test_audio_pipeline()
|
GstElement *test_audio_pipeline()
|
||||||
{
|
{
|
||||||
return audio_pipeline;
|
return audio_pipeline;
|
||||||
|
|
|
@ -72,19 +72,12 @@ struct track *audio_next();
|
||||||
/* Called to load the previous track. */
|
/* Called to load the previous track. */
|
||||||
struct track *audio_prev();
|
struct track *audio_prev();
|
||||||
|
|
||||||
/* Called when the state of the pipeline has changed. */
|
|
||||||
void audio_state_changed(GstMessage *);
|
|
||||||
|
|
||||||
/* Called when playback has reached the end-of-stream position. */
|
|
||||||
struct track *audio_eos();
|
|
||||||
|
|
||||||
/* Called when gstreamer has received an error. */
|
|
||||||
void audio_error(GstMessage *);
|
|
||||||
|
|
||||||
/* Called to configure automatic pausing. */
|
/* Called to configure automatic pausing. */
|
||||||
void audio_pause_after(int);
|
void audio_pause_after(int);
|
||||||
|
|
||||||
#ifdef CONFIG_TESTING
|
#ifdef CONFIG_TESTING
|
||||||
|
void test_audio_eos();
|
||||||
|
void test_audio_error(GError *, gchar *);
|
||||||
GstElement *test_audio_pipeline();
|
GstElement *test_audio_pipeline();
|
||||||
#endif /* CONFIG_TESTING */
|
#endif /* CONFIG_TESTING */
|
||||||
#endif /* OCARINA_CORE_AUDIO_H */
|
#endif /* OCARINA_CORE_AUDIO_H */
|
||||||
|
|
|
@ -24,17 +24,9 @@ static unsigned int test_wait_state(void)
|
||||||
|
|
||||||
static void test_send_error()
|
static void test_send_error()
|
||||||
{
|
{
|
||||||
GstMessage *message;
|
GError *error = g_error_new(1, G_FILE_ERROR_BADF, "Simulated Error");
|
||||||
GError *error;
|
test_audio_error(error, "Fake error for testing");
|
||||||
|
|
||||||
error = g_error_new(1, G_FILE_ERROR_BADF, "Simulated Error");
|
|
||||||
message = gst_message_new_error(GST_OBJECT(test_audio_pipeline()),
|
|
||||||
error, "Fake error for testing");
|
|
||||||
audio_error(message);
|
|
||||||
|
|
||||||
gst_message_unref(message);
|
|
||||||
g_error_free(error);
|
g_error_free(error);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_audio_load(struct track *track) { load_count++; }
|
static void test_audio_load(struct track *track) { load_count++; }
|
||||||
|
@ -221,14 +213,14 @@ void test_autopause()
|
||||||
|
|
||||||
state_count = 0;
|
state_count = 0;
|
||||||
for (i = 4; i > -1; i--) {
|
for (i = 4; i > -1; i--) {
|
||||||
audio_eos();
|
test_audio_eos();
|
||||||
g_assert_cmpuint(pause_count, ==, i);
|
g_assert_cmpuint(pause_count, ==, i);
|
||||||
g_assert_cmpuint(audio_cur_state(), ==, GST_STATE_PLAYING);
|
g_assert_cmpuint(audio_cur_state(), ==, GST_STATE_PLAYING);
|
||||||
g_assert(playlist_at(history, 0) == audio_cur_track());
|
g_assert(playlist_at(history, 0) == audio_cur_track());
|
||||||
}
|
}
|
||||||
g_assert_cmpuint(test_wait_state(), ==, 5);
|
g_assert_cmpuint(test_wait_state(), ==, 5);
|
||||||
|
|
||||||
audio_eos();
|
test_audio_eos();
|
||||||
while (idle_run_task()) {}
|
while (idle_run_task()) {}
|
||||||
g_assert_cmpint(pause_count, ==, -1);
|
g_assert_cmpint(pause_count, ==, -1);
|
||||||
g_assert_cmpuint(audio_cur_state(), ==, GST_STATE_PAUSED);
|
g_assert_cmpuint(audio_cur_state(), ==, GST_STATE_PAUSED);
|
||||||
|
|
|
@ -80,12 +80,12 @@ static void test_audio_buttons()
|
||||||
g_assert(audio_cur_track() == track_get(0));
|
g_assert(audio_cur_track() == track_get(0));
|
||||||
|
|
||||||
gtk_combo_box_set_active(GTK_COMBO_BOX(gui_pause_after()), 2);
|
gtk_combo_box_set_active(GTK_COMBO_BOX(gui_pause_after()), 2);
|
||||||
audio_eos();
|
test_audio_eos();
|
||||||
g_assert_cmpuint(audio_cur_state(), ==, GST_STATE_PLAYING);
|
g_assert_cmpuint(audio_cur_state(), ==, GST_STATE_PLAYING);
|
||||||
g_assert_cmpuint(gtk_combo_box_get_active(
|
g_assert_cmpuint(gtk_combo_box_get_active(
|
||||||
GTK_COMBO_BOX(gui_pause_after())), ==, 1);
|
GTK_COMBO_BOX(gui_pause_after())), ==, 1);
|
||||||
|
|
||||||
audio_eos();
|
test_audio_eos();
|
||||||
g_assert_cmpuint(audio_cur_state(), ==, GST_STATE_PAUSED);
|
g_assert_cmpuint(audio_cur_state(), ==, GST_STATE_PAUSED);
|
||||||
g_assert_cmpuint(gtk_combo_box_get_active(
|
g_assert_cmpuint(gtk_combo_box_get_active(
|
||||||
GTK_COMBO_BOX(gui_pause_after())), ==, 0);
|
GTK_COMBO_BOX(gui_pause_after())), ==, 0);
|
||||||
|
|
Loading…
Reference in New Issue