Skip to content

Commit 3408260

Browse files
committed
audio: Use get_device_alsadev() to support device' specific card/device
Implement support for card and device number specific to a given device. Change-Id: Idf34ee23cfcfa02692bcb8914dfdd38ebc1d724c Signed-off-by: Vincent Knecht <vincent.knecht@mailoo.org>
1 parent b79bf06 commit 3408260

1 file changed

Lines changed: 75 additions & 8 deletions

File tree

audio/audio_hw.c

Lines changed: 75 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,9 @@ static int out_set_parameters(struct audio_stream *stream, const char *kvpairs)
379379

380380
struct stream_out_common *out = (struct stream_out_common *)stream;
381381
struct audio_device *adev = out->dev;
382+
static uint32_t cardold, devold;
383+
static bool saved = false;
384+
uint32_t cardnum, devnum;
382385
uint32_t v;
383386
int ret;
384387

@@ -388,6 +391,23 @@ static int out_set_parameters(struct audio_stream *stream, const char *kvpairs)
388391

389392
if (ret >= 0) {
390393
apply_route(out->hw, v);
394+
if (get_device_alsadev(adev->cm, v, &cardnum, &devnum) < 0) {
395+
if (saved) {
396+
ALOGI("restoring params with card=%u dev=%u", cardold, devold);
397+
out->hw->card_number = cardold;
398+
out->hw->device_number = devold;
399+
}
400+
} else {
401+
ALOGI("updating params with card=%u dev=%u", cardnum, devnum);
402+
if (!saved) {
403+
cardold = out->hw->card_number;
404+
devold = out->hw->device_number;
405+
ALOGI("saved params with card=%u dev=%u", cardold, devold);
406+
saved = true;
407+
}
408+
out->hw->card_number = cardnum;
409+
out->hw->device_number = devnum;
410+
}
391411
}
392412

393413
stream_invoke_usecases(out->hw, kvpairs);
@@ -735,6 +755,8 @@ static void out_pcm_fill_params(struct stream_out_pcm *out,
735755
/* Must be called with hw device and output stream mutexes locked */
736756
static int start_output_pcm(struct stream_out_pcm *out)
737757
{
758+
struct config_mgr *cm = out->common.dev->cm;
759+
uint32_t device, cardnum, devnum;
738760
int ret;
739761

740762
struct pcm_config config = {
@@ -750,10 +772,21 @@ static int start_output_pcm(struct stream_out_pcm *out)
750772

751773
ALOGV("+start_output_stream(%p)", out);
752774

753-
out->pcm = pcm_open(out->common.hw->card_number,
754-
out->common.hw->device_number,
755-
PCM_OUT | PCM_MONOTONIC,
756-
&config);
775+
device = get_current_routes(out->common.hw);
776+
ret = get_device_alsadev(cm, device, &cardnum, &devnum);
777+
if (ret < 0) {
778+
ALOGI("device = %u (not alsadev, ret=%d)", device, ret);
779+
out->pcm = pcm_open(out->common.hw->card_number,
780+
out->common.hw->device_number,
781+
PCM_OUT | PCM_MONOTONIC,
782+
&config);
783+
} else {
784+
ALOGI("device = %u (alsadev)", device);
785+
out->pcm = pcm_open(cardnum,
786+
devnum,
787+
PCM_OUT | PCM_MONOTONIC,
788+
&config);
789+
}
757790

758791
if (out->pcm && !pcm_is_ready(out->pcm)) {
759792
ALOGE("pcm_open(out) failed: %s", pcm_get_error(out->pcm));
@@ -1799,6 +1832,8 @@ static void in_pcm_fill_params(struct stream_in_pcm *in,
17991832
/* Must be called with hw device and input stream mutexes locked */
18001833
static int do_open_pcm_input(struct stream_in_pcm *in)
18011834
{
1835+
struct config_mgr *cm = in->common.dev->cm;
1836+
uint32_t device, cardnum, devnum;
18021837
struct pcm_config config;
18031838
int ret;
18041839

@@ -1818,10 +1853,21 @@ static int do_open_pcm_input(struct stream_in_pcm *in)
18181853
config.format = pcm_format_from_android_format(in->common.format),
18191854
config.start_threshold = 0;
18201855

1821-
in->pcm = pcm_open(in->common.hw->card_number,
1822-
in->common.hw->device_number,
1823-
PCM_IN | PCM_MONOTONIC,
1824-
&config);
1856+
device = get_current_routes(in->common.hw);
1857+
ret = get_device_alsadev(cm, device, &cardnum, &devnum);
1858+
if (ret < 0) {
1859+
ALOGV("device = %u (not alsadev, ret=%d)", device, ret);
1860+
in->pcm = pcm_open(in->common.hw->card_number,
1861+
in->common.hw->device_number,
1862+
PCM_IN | PCM_MONOTONIC,
1863+
&config);
1864+
} else {
1865+
ALOGV("device = %u (alsadev)", device);
1866+
in->pcm = pcm_open(cardnum,
1867+
devnum,
1868+
PCM_IN | PCM_MONOTONIC,
1869+
&config);
1870+
}
18251871

18261872
if (!in->pcm || !pcm_is_ready(in->pcm)) {
18271873
ALOGE_IF(in->pcm,"pcm_open(in) failed: %s", pcm_get_error(in->pcm));
@@ -2047,12 +2093,16 @@ static ssize_t in_pcm_read(struct audio_stream_in *stream, void *buffer,
20472093
static int in_pcm_set_parameters(struct audio_stream *stream, const char *kvpairs)
20482094
{
20492095
struct stream_in_pcm *in = (struct stream_in_pcm *)stream;
2096+
struct config_mgr *cm = in->common.dev->cm;
20502097
struct str_parms *parms;
20512098
char value[32];
20522099
uint32_t new_routing = 0;
20532100
bool routing_changed;
20542101
uint32_t devices;
20552102
bool input_was_changed;
2103+
static uint32_t cardold, devold;
2104+
static bool saved = false;
2105+
uint32_t cardnum, devnum;
20562106
int ret;
20572107

20582108
ALOGV("+in_pcm_set_parameters(%p) '%s'", stream, kvpairs);
@@ -2091,6 +2141,23 @@ static int in_pcm_set_parameters(struct audio_stream *stream, const char *kvpair
20912141
if (in->common.hw) {
20922142
ALOGV("Apply routing=0x%x to input stream", new_routing);
20932143
apply_route(in->common.hw, new_routing);
2144+
if (get_device_alsadev(cm, new_routing, &cardnum, &devnum) < 0) {
2145+
if (saved) {
2146+
ALOGV("restoring params with card=%u dev=%u", cardold, devold);
2147+
in->common.hw->card_number = cardold;
2148+
in->common.hw->device_number = devold;
2149+
}
2150+
} else {
2151+
ALOGV("updating params with card=%u dev=%u", cardnum, devnum);
2152+
if (!saved) {
2153+
cardold = in->common.hw->card_number;
2154+
devold = in->common.hw->device_number;
2155+
ALOGV("saved params with card=%u dev=%u", cardold, devold);
2156+
saved = true;
2157+
}
2158+
in->common.hw->card_number = cardnum;
2159+
in->common.hw->device_number = devnum;
2160+
}
20942161
}
20952162
}
20962163

0 commit comments

Comments
 (0)