92 lines
1.7 KiB
C++
92 lines
1.7 KiB
C++
// Copyright (c) 2012 Bryan Schumaker.
|
|
#include <gst/interfaces/propertyprobe.h>
|
|
#include <libsaria/audio.h>
|
|
#include <libsaria/prefs.h>
|
|
#include <libsaria/print.h>
|
|
#include "audio.h"
|
|
|
|
#include <list>
|
|
using namespace std;
|
|
|
|
static GstElement *alsa = NULL;
|
|
static list<string> devices;
|
|
|
|
static void probe_devices()
|
|
{
|
|
GValueArray *array;
|
|
GValue *value;
|
|
|
|
devices.clear();
|
|
array = gst_property_probe_probe_and_get_values_name(GST_PROPERTY_PROBE(alsa), "device");
|
|
|
|
devices.push_back("default");
|
|
for (unsigned int i = 0; i < array->n_values; i++) {
|
|
value = g_value_array_get_nth(array, i);
|
|
devices.push_back(g_value_get_string(value));
|
|
}
|
|
}
|
|
|
|
static void set_alsa_device(string device)
|
|
{
|
|
g_object_set(G_OBJECT(alsa), "device", device.c_str(), NULL);
|
|
}
|
|
|
|
static void add_alsa()
|
|
{
|
|
println("Adding ALSA");
|
|
alsa = gst_element_factory_make("alsasink", "alsa");
|
|
probe_devices();
|
|
set_audio_sink(alsa);
|
|
}
|
|
|
|
static void remove_alsa()
|
|
{
|
|
println("Removing ALSA");
|
|
set_alsa_device("default");
|
|
/* Removing the sink will also deallocate it */
|
|
set_audio_sink(NULL);
|
|
}
|
|
|
|
namespace libsaria
|
|
{
|
|
|
|
void audio::use_alsa(bool use)
|
|
{
|
|
struct StoredAudioState state;
|
|
save_audio_state(&state);
|
|
|
|
if (use == true)
|
|
add_alsa();
|
|
else
|
|
remove_alsa();
|
|
|
|
load_audio_state(&state);
|
|
prefs::set("alsa", use);
|
|
}
|
|
|
|
bool audio::using_alsa()
|
|
{
|
|
return prefs::get_bool("alsa");
|
|
}
|
|
|
|
void audio::init_alsa()
|
|
{
|
|
use_alsa(using_alsa());
|
|
}
|
|
|
|
list<string> *audio::get_alsa_devices()
|
|
{
|
|
return &devices;
|
|
}
|
|
|
|
void audio::set_device(string &device)
|
|
{
|
|
struct StoredAudioState state;
|
|
|
|
save_audio_state(&state);
|
|
g_object_set(G_OBJECT(alsa), "device", device.c_str(), NULL);
|
|
load_audio_state(&state);
|
|
}
|
|
|
|
}; /* Namespace: libsaria */
|