From cc2178e5c39f0c2da2d4d5dff14210d5934bcc32 Mon Sep 17 00:00:00 2001 From: Pierre Ossman Date: Wed, 22 Feb 2006 14:11:23 +0000 Subject: Support for setting volume on sources. git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@560 fefdeb5f-60dc-0310-8127-8f9354f1896f --- src/polypcore/source.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) (limited to 'src/polypcore/source.c') diff --git a/src/polypcore/source.c b/src/polypcore/source.c index b70cb129..47325a1b 100644 --- a/src/polypcore/source.c +++ b/src/polypcore/source.c @@ -77,8 +77,13 @@ pa_source* pa_source_new( s->outputs = pa_idxset_new(NULL, NULL); s->monitor_of = NULL; + pa_cvolume_reset(&s->sw_volume, spec->channels); + pa_cvolume_reset(&s->hw_volume, spec->channels); + s->get_latency = NULL; s->notify = NULL; + s->set_hw_volume = NULL; + s->get_hw_volume = NULL; s->userdata = NULL; r = pa_idxset_put(core->sources, s, &s->index); @@ -110,6 +115,8 @@ void pa_source_disconnect(pa_source *s) { s->get_latency = NULL; s->notify = NULL; + s->get_hw_volume = NULL; + s->set_hw_volume = NULL; s->state = PA_SOURCE_DISCONNECTED; pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE | PA_SUBSCRIPTION_EVENT_REMOVE, s->index); @@ -173,7 +180,14 @@ void pa_source_post(pa_source*s, const pa_memchunk *chunk) { assert(chunk); pa_source_ref(s); + + if (!pa_cvolume_is_norm(&s->sw_volume)) { + pa_memchunk_make_writable(chunk, s->core->memblock_stat, 0); + pa_volume_memchunk(chunk, &s->sample_spec, &s->sw_volume); + } + pa_idxset_foreach(s->outputs, do_post, (void*) chunk); + pa_source_unref(s); } @@ -194,3 +208,40 @@ pa_usec_t pa_source_get_latency(pa_source *s) { return s->get_latency(s); } +void pa_source_set_volume(pa_source *s, pa_mixer_t m, const pa_cvolume *volume) { + pa_cvolume *v; + + assert(s); + assert(s->ref >= 1); + assert(volume); + + if (m == PA_MIXER_HARDWARE && s->set_hw_volume) + v = &s->hw_volume; + else + v = &s->sw_volume; + + if (pa_cvolume_equal(v, volume)) + return; + + *v = *volume; + + if (v == &s->hw_volume) + if (s->set_hw_volume(s) < 0) + s->sw_volume = *volume; + + pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE, s->index); +} + +const pa_cvolume *pa_source_get_volume(pa_source *s, pa_mixer_t m) { + assert(s); + assert(s->ref >= 1); + + if (m == PA_MIXER_HARDWARE && s->set_hw_volume) { + + if (s->get_hw_volume) + s->get_hw_volume(s); + + return &s->hw_volume; + } else + return &s->sw_volume; +} -- cgit