aboutsummaryrefslogtreecommitdiff
path: root/src/output/alsa_plugin.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/output/alsa_plugin.c')
-rw-r--r--src/output/alsa_plugin.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/src/output/alsa_plugin.c b/src/output/alsa_plugin.c
index 57d102c5..5f53729a 100644
--- a/src/output/alsa_plugin.c
+++ b/src/output/alsa_plugin.c
@@ -18,6 +18,7 @@
#include "../output_api.h"
#include "../utils.h"
+#include "../mixer.h"
#include <glib.h>
#include <alsa/asoundlib.h>
@@ -51,6 +52,9 @@ typedef struct _AlsaData {
unsigned int period_time;
int sampleSize;
int useMmap;
+
+ struct alsa_mixer *mixer;
+
} AlsaData;
static const char *
@@ -71,12 +75,15 @@ static AlsaData *newAlsaData(void)
ret->buffer_time = MPD_ALSA_BUFFER_TIME_US;
ret->period_time = 0;
+ ret->mixer = alsa_mixer_init();
+
return ret;
}
static void freeAlsaData(AlsaData * ad)
{
g_free(ad->device);
+ alsa_mixer_finish(ad->mixer);
free(ad);
}
@@ -125,8 +132,10 @@ static void *alsa_initDriver(mpd_unused struct audio_output *ao,
free_global_registered = 1;
}
- if (param)
+ if (param) {
alsa_configure(ad, param);
+ alsa_mixer_configure(ad->mixer, param);
+ }
return ad;
}
@@ -181,6 +190,8 @@ static bool alsa_openDevice(void *data, struct audio_format *audioFormat)
unsigned int period_time, period_time_ro;
unsigned int buffer_time;
+ alsa_mixer_open(ad->mixer);
+
if ((bitformat = get_bitformat(audioFormat)) == SND_PCM_FORMAT_UNKNOWN)
g_warning("ALSA device \"%s\" doesn't support %u bit audio\n",
alsa_device(ad), audioFormat->bits);
@@ -403,6 +414,7 @@ static void alsa_closeDevice(void *data)
snd_pcm_close(ad->pcmHandle);
ad->pcmHandle = NULL;
}
+ alsa_mixer_close(ad->mixer);
}
static bool
@@ -436,6 +448,13 @@ alsa_playAudio(void *data, const char *playChunk, size_t size)
return true;
}
+static bool
+alsa_control(void *data, int cmd, void *arg)
+{
+ AlsaData *ad = data;
+ return alsa_mixer_control(ad->mixer, cmd, arg);
+}
+
const struct audio_output_plugin alsaPlugin = {
.name = "alsa",
.test_default_device = alsa_testDefault,
@@ -445,4 +464,5 @@ const struct audio_output_plugin alsaPlugin = {
.play = alsa_playAudio,
.cancel = alsa_dropBufferedAudio,
.close = alsa_closeDevice,
+ .control = alsa_control
};