mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-04 13:29:59 -05:00
implement esd sample panning. closes #428
This commit is contained in:
parent
73c763cb08
commit
2e9479b1f3
1 changed files with 63 additions and 5 deletions
|
|
@ -165,6 +165,7 @@ static int esd_proto_get_latency(connection *c, esd_proto_t request, const void
|
||||||
static int esd_proto_server_info(connection *c, esd_proto_t request, const void *data, size_t length);
|
static int esd_proto_server_info(connection *c, esd_proto_t request, const void *data, size_t length);
|
||||||
static int esd_proto_all_info(connection *c, esd_proto_t request, const void *data, size_t length);
|
static int esd_proto_all_info(connection *c, esd_proto_t request, const void *data, size_t length);
|
||||||
static int esd_proto_stream_pan(connection *c, esd_proto_t request, const void *data, size_t length);
|
static int esd_proto_stream_pan(connection *c, esd_proto_t request, const void *data, size_t length);
|
||||||
|
static int esd_proto_sample_pan(connection *c, esd_proto_t request, const void *data, size_t length);
|
||||||
static int esd_proto_sample_cache(connection *c, esd_proto_t request, const void *data, size_t length);
|
static int esd_proto_sample_cache(connection *c, esd_proto_t request, const void *data, size_t length);
|
||||||
static int esd_proto_sample_free_or_play(connection *c, esd_proto_t request, const void *data, size_t length);
|
static int esd_proto_sample_free_or_play(connection *c, esd_proto_t request, const void *data, size_t length);
|
||||||
static int esd_proto_sample_get_id(connection *c, esd_proto_t request, const void *data, size_t length);
|
static int esd_proto_sample_get_id(connection *c, esd_proto_t request, const void *data, size_t length);
|
||||||
|
|
@ -199,7 +200,7 @@ static struct proto_handler proto_map[ESD_PROTO_MAX] = {
|
||||||
{ (size_t) -1, NULL, "TODO: unsubscribe" },
|
{ (size_t) -1, NULL, "TODO: unsubscribe" },
|
||||||
|
|
||||||
{ 3 * sizeof(int), esd_proto_stream_pan, "stream pan"},
|
{ 3 * sizeof(int), esd_proto_stream_pan, "stream pan"},
|
||||||
{ 3 * sizeof(int), NULL, "sample pan" },
|
{ 3 * sizeof(int), esd_proto_sample_pan, "sample pan" },
|
||||||
|
|
||||||
{ sizeof(int), NULL, "standby mode" },
|
{ sizeof(int), NULL, "standby mode" },
|
||||||
{ 0, esd_proto_get_latency, "get latency" }
|
{ 0, esd_proto_get_latency, "get latency" }
|
||||||
|
|
@ -685,9 +686,26 @@ static int esd_proto_all_info(connection *c, esd_proto_t request, const void *da
|
||||||
for (ce = pa_idxset_first(c->protocol->core->scache, &idx); ce; ce = pa_idxset_next(c->protocol->core->scache, &idx)) {
|
for (ce = pa_idxset_first(c->protocol->core->scache, &idx); ce; ce = pa_idxset_next(c->protocol->core->scache, &idx)) {
|
||||||
int32_t id, rate, lvolume, rvolume, format, len;
|
int32_t id, rate, lvolume, rvolume, format, len;
|
||||||
char name[ESD_NAME_MAX];
|
char name[ESD_NAME_MAX];
|
||||||
|
pa_channel_map stereo = { .channels = 2, .map = { PA_CHANNEL_POSITION_LEFT, PA_CHANNEL_POSITION_RIGHT } };
|
||||||
|
pa_cvolume volume;
|
||||||
|
pa_sample_spec ss;
|
||||||
|
|
||||||
pa_assert(t >= s*2);
|
pa_assert(t >= s*2);
|
||||||
|
|
||||||
|
if (ce->volume_is_set) {
|
||||||
|
volume = ce->volume;
|
||||||
|
pa_cvolume_remap(&volume, &ce->channel_map, &stereo);
|
||||||
|
} else
|
||||||
|
pa_cvolume_reset(&volume, 2);
|
||||||
|
|
||||||
|
if (ce->memchunk.memblock)
|
||||||
|
ss = ce->sample_spec;
|
||||||
|
else {
|
||||||
|
ss.format = PA_SAMPLE_S16NE;
|
||||||
|
ss.rate = 44100;
|
||||||
|
ss.channels = 2;
|
||||||
|
}
|
||||||
|
|
||||||
/* id */
|
/* id */
|
||||||
id = PA_MAYBE_INT32_SWAP(c->swap_byte_order, (int) (ce->index+1));
|
id = PA_MAYBE_INT32_SWAP(c->swap_byte_order, (int) (ce->index+1));
|
||||||
connection_write(c, &id, sizeof(int32_t));
|
connection_write(c, &id, sizeof(int32_t));
|
||||||
|
|
@ -701,19 +719,19 @@ static int esd_proto_all_info(connection *c, esd_proto_t request, const void *da
|
||||||
connection_write(c, name, ESD_NAME_MAX);
|
connection_write(c, name, ESD_NAME_MAX);
|
||||||
|
|
||||||
/* rate */
|
/* rate */
|
||||||
rate = PA_MAYBE_INT32_SWAP(c->swap_byte_order, (int32_t) ce->sample_spec.rate);
|
rate = PA_MAYBE_INT32_SWAP(c->swap_byte_order, (int32_t) ss.rate);
|
||||||
connection_write(c, &rate, sizeof(int32_t));
|
connection_write(c, &rate, sizeof(int32_t));
|
||||||
|
|
||||||
/* left */
|
/* left */
|
||||||
lvolume = PA_MAYBE_INT32_SWAP(c->swap_byte_order, (int32_t) ((ce->volume.values[0]*ESD_VOLUME_BASE)/PA_VOLUME_NORM));
|
lvolume = PA_MAYBE_INT32_SWAP(c->swap_byte_order, (int32_t) ((volume.values[0]*ESD_VOLUME_BASE)/PA_VOLUME_NORM));
|
||||||
connection_write(c, &lvolume, sizeof(int32_t));
|
connection_write(c, &lvolume, sizeof(int32_t));
|
||||||
|
|
||||||
/*right*/
|
/*right*/
|
||||||
rvolume = PA_MAYBE_INT32_SWAP(c->swap_byte_order, (int32_t) ((ce->volume.values[0]*ESD_VOLUME_BASE)/PA_VOLUME_NORM));
|
rvolume = PA_MAYBE_INT32_SWAP(c->swap_byte_order, (int32_t) ((volume.values[1]*ESD_VOLUME_BASE)/PA_VOLUME_NORM));
|
||||||
connection_write(c, &rvolume, sizeof(int32_t));
|
connection_write(c, &rvolume, sizeof(int32_t));
|
||||||
|
|
||||||
/*format*/
|
/*format*/
|
||||||
format = PA_MAYBE_INT32_SWAP(c->swap_byte_order, format_native2esd(&ce->sample_spec));
|
format = PA_MAYBE_INT32_SWAP(c->swap_byte_order, format_native2esd(&ss));
|
||||||
connection_write(c, &format, sizeof(int32_t));
|
connection_write(c, &format, sizeof(int32_t));
|
||||||
|
|
||||||
/*length*/
|
/*length*/
|
||||||
|
|
@ -767,6 +785,46 @@ static int esd_proto_stream_pan(connection *c, esd_proto_t request, const void *
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int esd_proto_sample_pan(connection *c, esd_proto_t request, const void *data, size_t length) {
|
||||||
|
int32_t ok = 0;
|
||||||
|
uint32_t idx, lvolume, rvolume;
|
||||||
|
pa_cvolume volume;
|
||||||
|
pa_scache_entry *ce;
|
||||||
|
|
||||||
|
connection_assert_ref(c);
|
||||||
|
pa_assert(data);
|
||||||
|
pa_assert(length == sizeof(int32_t)*3);
|
||||||
|
|
||||||
|
memcpy(&idx, data, sizeof(uint32_t));
|
||||||
|
idx = PA_MAYBE_UINT32_SWAP(c->swap_byte_order, idx) - 1;
|
||||||
|
data = (const char*)data + sizeof(uint32_t);
|
||||||
|
|
||||||
|
memcpy(&lvolume, data, sizeof(uint32_t));
|
||||||
|
lvolume = PA_MAYBE_UINT32_SWAP(c->swap_byte_order, lvolume);
|
||||||
|
data = (const char*)data + sizeof(uint32_t);
|
||||||
|
|
||||||
|
memcpy(&rvolume, data, sizeof(uint32_t));
|
||||||
|
rvolume = PA_MAYBE_UINT32_SWAP(c->swap_byte_order, rvolume);
|
||||||
|
data = (const char*)data + sizeof(uint32_t);
|
||||||
|
|
||||||
|
volume.values[0] = (lvolume*PA_VOLUME_NORM)/ESD_VOLUME_BASE;
|
||||||
|
volume.values[1] = (rvolume*PA_VOLUME_NORM)/ESD_VOLUME_BASE;
|
||||||
|
volume.channels = 2;
|
||||||
|
|
||||||
|
if ((ce = pa_idxset_get_by_index(c->protocol->core->scache, idx))) {
|
||||||
|
pa_channel_map stereo = { .channels = 2, .map = { PA_CHANNEL_POSITION_LEFT, PA_CHANNEL_POSITION_RIGHT } };
|
||||||
|
|
||||||
|
pa_cvolume_remap(&volume, &stereo, &ce->channel_map);
|
||||||
|
ce->volume = volume;
|
||||||
|
ce->volume_is_set = TRUE;
|
||||||
|
ok = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
connection_write(c, &ok, sizeof(int32_t));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int esd_proto_sample_cache(connection *c, esd_proto_t request, const void *data, size_t length) {
|
static int esd_proto_sample_cache(connection *c, esd_proto_t request, const void *data, size_t length) {
|
||||||
pa_sample_spec ss;
|
pa_sample_spec ss;
|
||||||
int32_t format, rate, sc_length;
|
int32_t format, rate, sc_length;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue