core/audio: Add support for changing audio volume
Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
parent
f02dff4177
commit
d8c3fb9ace
26
core/audio.c
26
core/audio.c
|
@ -7,6 +7,7 @@
|
||||||
#include <core/settings.h>
|
#include <core/settings.h>
|
||||||
|
|
||||||
static const char *SETTINGS_TRACK = "core.audio.cur";
|
static const char *SETTINGS_TRACK = "core.audio.cur";
|
||||||
|
static const char *SETTINGS_VOLUME = "core.audio.volume";
|
||||||
static struct file audio_file = FILE_INIT("cur_track", 0, 0);
|
static struct file audio_file = FILE_INIT("cur_track", 0, 0);
|
||||||
static struct track *audio_track = NULL;
|
static struct track *audio_track = NULL;
|
||||||
static GstElement *audio_player = NULL;
|
static GstElement *audio_player = NULL;
|
||||||
|
@ -96,12 +97,14 @@ static bool __audio_init_idle(void *data)
|
||||||
file_remove(&audio_file);
|
file_remove(&audio_file);
|
||||||
__audio_load(track_get(track), GST_STATE_PAUSED);
|
__audio_load(track_get(track), GST_STATE_PAUSED);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void audio_init(int *argc, char ***argv, struct audio_ops *ops)
|
void audio_init(int *argc, char ***argv, struct audio_ops *ops)
|
||||||
{
|
{
|
||||||
|
unsigned int volume = 100;
|
||||||
GstBus *bus;
|
GstBus *bus;
|
||||||
|
|
||||||
gst_init(argc, argv);
|
gst_init(argc, argv);
|
||||||
|
@ -112,6 +115,10 @@ void audio_init(int *argc, char ***argv, struct audio_ops *ops)
|
||||||
audio_bus = gst_bus_add_watch(bus, __audio_message, NULL);
|
audio_bus = gst_bus_add_watch(bus, __audio_message, NULL);
|
||||||
gst_object_unref(bus);
|
gst_object_unref(bus);
|
||||||
|
|
||||||
|
if (settings_has(SETTINGS_VOLUME))
|
||||||
|
volume = settings_get(SETTINGS_VOLUME);
|
||||||
|
audio_set_volume(volume);
|
||||||
|
|
||||||
idle_schedule(IDLE_SYNC, __audio_init_idle, NULL);
|
idle_schedule(IDLE_SYNC, __audio_init_idle, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -155,6 +162,25 @@ GstState audio_cur_state()
|
||||||
return cur;
|
return cur;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void audio_set_volume(unsigned int volume)
|
||||||
|
{
|
||||||
|
gdouble vol;
|
||||||
|
|
||||||
|
if (volume > 100)
|
||||||
|
volume = 100;
|
||||||
|
vol = (gdouble)volume / 100;
|
||||||
|
|
||||||
|
settings_set(SETTINGS_VOLUME, volume);
|
||||||
|
g_object_set(G_OBJECT(audio_player), "volume", vol, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int audio_get_volume()
|
||||||
|
{
|
||||||
|
gdouble volume;
|
||||||
|
g_object_get(G_OBJECT(audio_player), "volume", &volume, NULL);
|
||||||
|
return volume * 100;
|
||||||
|
}
|
||||||
|
|
||||||
bool audio_play()
|
bool audio_play()
|
||||||
{
|
{
|
||||||
if (!audio_track)
|
if (!audio_track)
|
||||||
|
|
|
@ -43,6 +43,13 @@ struct track *audio_cur_track();
|
||||||
GstState audio_cur_state();
|
GstState audio_cur_state();
|
||||||
|
|
||||||
|
|
||||||
|
/* Called to set the playback volume. */
|
||||||
|
void audio_set_volume(unsigned int);
|
||||||
|
|
||||||
|
/* Called to get the playback volume. */
|
||||||
|
unsigned int audio_get_volume();
|
||||||
|
|
||||||
|
|
||||||
/* Called to begin playback. */
|
/* Called to begin playback. */
|
||||||
bool audio_play();
|
bool audio_play();
|
||||||
|
|
||||||
|
|
|
@ -70,6 +70,7 @@ static void test_init()
|
||||||
g_assert_false(audio_seek(7));
|
g_assert_false(audio_seek(7));
|
||||||
g_assert_cmpuint(audio_position(), ==, 0);
|
g_assert_cmpuint(audio_position(), ==, 0);
|
||||||
g_assert_cmpuint(audio_duration(), ==, 0);
|
g_assert_cmpuint(audio_duration(), ==, 0);
|
||||||
|
g_assert_cmpuint(audio_get_volume(), ==, 100);
|
||||||
g_assert_null(audio_cur_track());
|
g_assert_null(audio_cur_track());
|
||||||
g_assert_cmpuint(audio_cur_state(), ==, GST_STATE_NULL);
|
g_assert_cmpuint(audio_cur_state(), ==, GST_STATE_NULL);
|
||||||
g_assert_cmpuint(load_count, ==, 0);
|
g_assert_cmpuint(load_count, ==, 0);
|
||||||
|
@ -100,6 +101,13 @@ static void test_playback()
|
||||||
g_assert_cmpuint(audio_duration(), ==, tracks[0]->tr_length * GST_SECOND);
|
g_assert_cmpuint(audio_duration(), ==, tracks[0]->tr_length * GST_SECOND);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
audio_set_volume(0);
|
||||||
|
g_assert_cmpfloat(audio_get_volume(), ==, 0);
|
||||||
|
audio_set_volume(50);
|
||||||
|
g_assert_cmpfloat(audio_get_volume(), ==, 50);
|
||||||
|
audio_set_volume(150);
|
||||||
|
g_assert_cmpfloat(audio_get_volume(), ==, 100);
|
||||||
|
|
||||||
g_assert_true(audio_pause());
|
g_assert_true(audio_pause());
|
||||||
g_assert_false(audio_pause());
|
g_assert_false(audio_pause());
|
||||||
g_assert_cmpuint(state_count, ==, 2);
|
g_assert_cmpuint(state_count, ==, 2);
|
||||||
|
|
Loading…
Reference in New Issue