core/audio: Move audio_pause_after() out of the audio namespace
Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This commit is contained in:
parent
d18d3dd214
commit
276c56406a
|
@ -14,9 +14,7 @@ static struct file audio_file;
|
||||||
static struct track *audio_track = NULL;
|
static struct track *audio_track = NULL;
|
||||||
static GstElement *audio_player = NULL;
|
static GstElement *audio_player = NULL;
|
||||||
static struct audio_ops *audio_ops = NULL;
|
static struct audio_ops *audio_ops = NULL;
|
||||||
|
static int audio_pause_count = -1;
|
||||||
static bool _pause_enabled = false;
|
|
||||||
static unsigned int _pause_count = 0;
|
|
||||||
|
|
||||||
static AudioDriver *cur_driver = NULL;
|
static AudioDriver *cur_driver = NULL;
|
||||||
|
|
||||||
|
@ -60,17 +58,12 @@ static bool __audio_load(struct track *track, GstState state)
|
||||||
|
|
||||||
static GstState continue_playback()
|
static GstState continue_playback()
|
||||||
{
|
{
|
||||||
GstState ret = GST_STATE_PLAYING;
|
if (audio_pause_count >= 0) {
|
||||||
|
audio_pause_after(audio_pause_count - 1);
|
||||||
if (_pause_enabled) {
|
if (audio_pause_count == -1)
|
||||||
if (_pause_count == 0) {
|
return GST_STATE_PAUSED;
|
||||||
ret = GST_STATE_PAUSED;
|
|
||||||
_pause_enabled = false;
|
|
||||||
} else
|
|
||||||
_pause_count--;
|
|
||||||
}
|
}
|
||||||
|
return GST_STATE_PLAYING;
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -97,7 +90,8 @@ void AudioDriver :: eos()
|
||||||
track = tempq_next();
|
track = tempq_next();
|
||||||
if (!track)
|
if (!track)
|
||||||
track = queue_next(collection_get_queue());
|
track = queue_next(collection_get_queue());
|
||||||
__audio_load(track, continue_playback());
|
if (__audio_load(track, continue_playback()))
|
||||||
|
history_add(track);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -224,23 +218,12 @@ struct track *audio_prev()
|
||||||
return track;
|
return track;
|
||||||
}
|
}
|
||||||
|
|
||||||
void audio :: pause_after(bool enabled, unsigned int n)
|
void audio_pause_after(int n)
|
||||||
{
|
{
|
||||||
if (n > _pause_count)
|
if (n != audio_pause_count) {
|
||||||
enabled = true;
|
audio_pause_count = n;
|
||||||
|
audio_ops->on_config_pause(audio_pause_count);
|
||||||
_pause_enabled = enabled;
|
}
|
||||||
_pause_count = n;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool audio :: pause_enabled()
|
|
||||||
{
|
|
||||||
return _pause_enabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int audio :: pause_count()
|
|
||||||
{
|
|
||||||
return _pause_count;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioDriver *audio :: get_driver()
|
AudioDriver *audio :: get_driver()
|
||||||
|
|
20
gui/gst.cpp
20
gui/gst.cpp
|
@ -69,11 +69,22 @@ static void on_load(struct track *track, GstState state)
|
||||||
on_pause();
|
on_pause();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void on_config_pause(int n)
|
||||||
|
{
|
||||||
|
if (n == -1)
|
||||||
|
o_enabled->set_active(false);
|
||||||
|
else {
|
||||||
|
o_count->set_value(n);
|
||||||
|
o_enabled->set_active(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class GSTDriver : public AudioDriver {} gst_driver;
|
class GSTDriver : public AudioDriver {} gst_driver;
|
||||||
|
|
||||||
struct audio_ops audio_ops = {
|
struct audio_ops audio_ops = {
|
||||||
on_load,
|
on_load,
|
||||||
|
on_config_pause,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -109,8 +120,6 @@ static gboolean on_gst_message(GstBus *bus, GstMessage *message, gpointer data)
|
||||||
break;
|
break;
|
||||||
case GST_MESSAGE_EOS:
|
case GST_MESSAGE_EOS:
|
||||||
gst_driver.eos();
|
gst_driver.eos();
|
||||||
o_count->set_value(audio :: pause_count());
|
|
||||||
o_enabled->set_active(audio :: pause_enabled());
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -128,12 +137,15 @@ static bool on_seek(Gtk::ScrollType type, double value)
|
||||||
static void on_pause_count()
|
static void on_pause_count()
|
||||||
{
|
{
|
||||||
o_enabled->set_active(true);
|
o_enabled->set_active(true);
|
||||||
audio :: pause_after(true, o_count->get_value());
|
audio_pause_after(o_count->get_value());
|
||||||
}
|
}
|
||||||
|
|
||||||
static void on_pause_enabled()
|
static void on_pause_enabled()
|
||||||
{
|
{
|
||||||
audio :: pause_after(o_enabled->get_active(), o_count->get_value());
|
if (!o_enabled->get_active())
|
||||||
|
audio_pause_after(-1);
|
||||||
|
else
|
||||||
|
audio_pause_after(o_count->get_value());
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool on_timeout()
|
static bool on_timeout()
|
||||||
|
|
|
@ -15,6 +15,9 @@ extern "C" {
|
||||||
struct audio_ops {
|
struct audio_ops {
|
||||||
/* Called when a track is loaded. */
|
/* Called when a track is loaded. */
|
||||||
void (*on_load)(struct track *, GstState);
|
void (*on_load)(struct track *, GstState);
|
||||||
|
|
||||||
|
/* Called when the automatic pause state changes. */
|
||||||
|
void (*on_config_pause)(int);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -40,28 +43,6 @@ public:
|
||||||
namespace audio
|
namespace audio
|
||||||
{
|
{
|
||||||
|
|
||||||
/**
|
|
||||||
* Configure the automatic pausing feature.
|
|
||||||
*
|
|
||||||
* @param enabled Set to true to enable pausing, false to disable.
|
|
||||||
* @param n Number of tracks to play before pausing.
|
|
||||||
*/
|
|
||||||
void pause_after(bool, unsigned int);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Call to find the current automatic pausing state.
|
|
||||||
*
|
|
||||||
* @return True if automatic pausing is enabled, false otherwise.
|
|
||||||
*/
|
|
||||||
bool pause_enabled();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Call to find the number of tracks remaining before pausing.
|
|
||||||
*
|
|
||||||
* @return The number of tracks before pausing.
|
|
||||||
*/
|
|
||||||
unsigned int pause_count();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called to access an audio driver.
|
* Called to access an audio driver.
|
||||||
*
|
*
|
||||||
|
@ -113,5 +94,8 @@ 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 to configure automatic pausing. */
|
||||||
|
void audio_pause_after(int);
|
||||||
|
|
||||||
GstElement *audio_get_player();
|
GstElement *audio_get_player();
|
||||||
#endif /* OCARINA_CORE_AUDIO_H */
|
#endif /* OCARINA_CORE_AUDIO_H */
|
||||||
|
|
|
@ -13,6 +13,7 @@ extern "C" {
|
||||||
|
|
||||||
struct track *TRACK_NULL = NULL;
|
struct track *TRACK_NULL = NULL;
|
||||||
static unsigned int load_count = 0;
|
static unsigned int load_count = 0;
|
||||||
|
static int pause_count = 0;
|
||||||
|
|
||||||
|
|
||||||
static bool test_audio_seek(gint64 pos)
|
static bool test_audio_seek(gint64 pos)
|
||||||
|
@ -41,8 +42,11 @@ static void test_audio_load(struct track *track, GstState state)
|
||||||
load_count++;
|
load_count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_config_pause(int n) { pause_count = n; }
|
||||||
|
|
||||||
static struct audio_ops test_audio_ops = {
|
static struct audio_ops test_audio_ops = {
|
||||||
test_audio_load,
|
test_audio_load,
|
||||||
|
test_config_pause,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct core_init_data test_init_data = {
|
static struct core_init_data test_init_data = {
|
||||||
|
@ -190,6 +194,37 @@ static void test_prev()
|
||||||
test_equal(audio_cur_track()->tr_dbe.dbe_index, 2);
|
test_equal(audio_cur_track()->tr_dbe.dbe_index, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test_autopause()
|
||||||
|
{
|
||||||
|
TestDriver *driver = (TestDriver *)audio :: get_driver();
|
||||||
|
struct queue *history_q = history_get_queue();
|
||||||
|
int i;
|
||||||
|
|
||||||
|
test_equal(audio_play(), true);
|
||||||
|
test_equal(pause_count, 0);
|
||||||
|
|
||||||
|
audio_pause_after(3);
|
||||||
|
test_equal(pause_count, 3);
|
||||||
|
|
||||||
|
pause_count = 0;
|
||||||
|
audio_pause_after(3);
|
||||||
|
test_equal(pause_count, 0);
|
||||||
|
|
||||||
|
audio_pause_after(5);
|
||||||
|
test_equal(pause_count, 5);
|
||||||
|
|
||||||
|
for (i = 4; i > -1; i--) {
|
||||||
|
driver->eos();
|
||||||
|
test_loop_equal(pause_count, i, i);
|
||||||
|
test_loop_equal(audio_cur_state(), GST_STATE_PLAYING, i);
|
||||||
|
test_loop_equal(queue_at(history_q, 0), audio_cur_track(), i);
|
||||||
|
} test_loop_passed();
|
||||||
|
|
||||||
|
driver->eos();
|
||||||
|
test_equal(pause_count, -1);
|
||||||
|
test_not_equal(audio_cur_state(), GST_STATE_PLAYING);
|
||||||
|
}
|
||||||
|
|
||||||
static void test_deinit()
|
static void test_deinit()
|
||||||
{
|
{
|
||||||
core :: deinit();
|
core :: deinit();
|
||||||
|
@ -199,45 +234,11 @@ static void test_deinit()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void test_autopause()
|
|
||||||
{
|
|
||||||
TestDriver *driver = (TestDriver *)audio :: get_driver();
|
|
||||||
|
|
||||||
core :: init(NULL, NULL, &test_init_data);
|
|
||||||
audio_play();
|
|
||||||
test_equal(audio :: pause_enabled(), false);
|
|
||||||
test_equal(audio :: pause_count(), (unsigned)0);
|
|
||||||
|
|
||||||
audio :: pause_after(true, 3);
|
|
||||||
test_equal(audio :: pause_enabled(), true);
|
|
||||||
test_equal(audio :: pause_count(), (unsigned)3);
|
|
||||||
|
|
||||||
audio :: pause_after(false, 3);
|
|
||||||
test_equal(audio :: pause_enabled(), false);
|
|
||||||
test_equal(audio :: pause_count(), (unsigned)3);
|
|
||||||
|
|
||||||
audio :: pause_after(false, 5);
|
|
||||||
test_equal(audio :: pause_enabled(), true);
|
|
||||||
test_equal(audio :: pause_count(), (unsigned)5);
|
|
||||||
|
|
||||||
for (int i = 4; i >= 0; i--) {
|
|
||||||
driver->eos();
|
|
||||||
test_equal(audio :: pause_enabled(), true);
|
|
||||||
test_equal(audio :: pause_count(), (unsigned)i);
|
|
||||||
test_equal(driver->is_playing(), true);
|
|
||||||
}
|
|
||||||
|
|
||||||
driver->eos();
|
|
||||||
test_equal(audio :: pause_enabled(), false);
|
|
||||||
test_equal(audio :: pause_count(), (unsigned)0);
|
|
||||||
test_equal(driver->is_playing(), false);
|
|
||||||
}
|
|
||||||
|
|
||||||
DECLARE_UNIT_TESTS(
|
DECLARE_UNIT_TESTS(
|
||||||
UNIT_TEST("Audio Initialization", test_init),
|
UNIT_TEST("Audio Initialization", test_init),
|
||||||
UNIT_TEST("Audio Playback", test_playback),
|
UNIT_TEST("Audio Playback", test_playback),
|
||||||
UNIT_TEST("Audio Next", test_next),
|
UNIT_TEST("Audio Next", test_next),
|
||||||
UNIT_TEST("Audio Previous", test_prev),
|
UNIT_TEST("Audio Previous", test_prev),
|
||||||
|
UNIT_TEST("Audio Automatic Pausing", test_autopause),
|
||||||
UNIT_TEST("Audio Deinitialization", test_deinit),
|
UNIT_TEST("Audio Deinitialization", test_deinit),
|
||||||
UNIT_TEST("Test Audio Automatic Pausing", test_autopause),
|
|
||||||
);
|
);
|
||||||
|
|
Loading…
Reference in New Issue