summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChinyue Chen <chinyue@google.com>2017-05-12 14:31:27 +0800
committerchrome-bot <chrome-bot@chromium.org>2017-05-19 13:57:45 -0700
commit70182dd089ce9646f371ce0188ce4423d7f64f6a (patch)
tree794cf5e83c55f4be307d77b6cdf61788c92aa36f
parent1a8074b548ea350eede9d5a09386810690fb5209 (diff)
downloadadhd-70182dd089ce9646f371ce0188ce4423d7f64f6a.tar.gz
CRAS: Deduplicate snd_pcm_open calls when opening a device.
The current open device flow includes several functions like cras_alsa_fill_properties and update_channel_layout. They are used only once in the flow but each calls snd_pcm_open and then snd_pcm_close the device. Since snd_pcm_open is one of the most time-consuming hardware operations, the CL extracts the snd_pcm_open calls to the beginning of the device open flow to save time. 1. Update cras_alsa_fill_properties and update_channel_layout to take a handle as argument and do not invoke snd_pcm_open. 2. Rename existing open_dev functions to configure_dev. open_dev is now called at the beginning of the device open flow and invokes the snd_pcm_open call. 3. Put open_dev, cras_iodev_set_format, and configure_dev inside the cras_iodev_open function. BUG=b:719812 TEST=make check and tested on reef Cuts time to open speakers from 78ms to 42ms Change-Id: I9b161217def5e87bf892f4ca8148f07bed5e71a5 Reviewed-on: https://chromium-review.googlesource.com/505974 Commit-Ready: Chinyue Chen <chinyue@chromium.org> Tested-by: Chinyue Chen <chinyue@chromium.org> Reviewed-by: Dylan Reid <dgreid@chromium.org>
-rw-r--r--cras/src/server/cras_a2dp_iodev.c4
-rw-r--r--cras/src/server/cras_alsa_helpers.c13
-rw-r--r--cras/src/server/cras_alsa_helpers.h5
-rw-r--r--cras/src/server/cras_alsa_io.c64
-rw-r--r--cras/src/server/cras_bt_io.c6
-rw-r--r--cras/src/server/cras_empty_iodev.c4
-rw-r--r--cras/src/server/cras_hfp_iodev.c4
-rw-r--r--cras/src/server/cras_iodev.c23
-rw-r--r--cras/src/server/cras_iodev.h5
-rw-r--r--cras/src/server/cras_iodev_list.c8
-rw-r--r--cras/src/server/cras_loopback_iodev.c4
-rw-r--r--cras/src/server/test_iodev.c4
-rw-r--r--cras/src/tests/a2dp_iodev_unittest.cc8
-rw-r--r--cras/src/tests/alsa_io_unittest.cc16
-rw-r--r--cras/src/tests/audio_thread_unittest.cc7
-rw-r--r--cras/src/tests/bt_device_unittest.cc4
-rw-r--r--cras/src/tests/bt_io_unittest.cc16
-rw-r--r--cras/src/tests/hfp_iodev_unittest.cc6
-rw-r--r--cras/src/tests/iodev_list_unittest.cc3
-rw-r--r--cras/src/tests/iodev_unittest.cc42
-rw-r--r--cras/src/tests/loopback_iodev_unittest.cc6
21 files changed, 133 insertions, 119 deletions
diff --git a/cras/src/server/cras_a2dp_iodev.c b/cras/src/server/cras_a2dp_iodev.c
index a9551a12..75aa71f4 100644
--- a/cras/src/server/cras_a2dp_iodev.c
+++ b/cras/src/server/cras_a2dp_iodev.c
@@ -135,7 +135,7 @@ static int frames_queued(const struct cras_iodev *iodev,
MAX(estimate_queued_frames, local_queued_frames));
}
-static int open_dev(struct cras_iodev *iodev)
+static int configure_dev(struct cras_iodev *iodev)
{
struct a2dp_io *a2dpio = (struct a2dp_io *)iodev;
int sock_depth;
@@ -484,7 +484,7 @@ struct cras_iodev *a2dp_iodev_create(struct cras_bt_transport *transport)
strlen(cras_bt_device_object_path(device)));
iodev->info.stable_id_new = iodev->info.stable_id;
- iodev->open_dev = open_dev;
+ iodev->configure_dev = configure_dev;
iodev->frames_queued = frames_queued;
iodev->delay_frames = delay_frames;
iodev->get_buffer = get_buffer;
diff --git a/cras/src/server/cras_alsa_helpers.c b/cras/src/server/cras_alsa_helpers.c
index a8719c2c..fd411d00 100644
--- a/cras/src/server/cras_alsa_helpers.c
+++ b/cras/src/server/cras_alsa_helpers.c
@@ -385,25 +385,16 @@ done:
return rc;
}
-int cras_alsa_fill_properties(const char *dev, snd_pcm_stream_t stream,
+int cras_alsa_fill_properties(snd_pcm_t *handle,
size_t **rates, size_t **channel_counts,
snd_pcm_format_t **formats)
{
int rc;
- snd_pcm_t *handle;
size_t i, num_found;
snd_pcm_hw_params_t *params;
snd_pcm_hw_params_alloca(&params);
- rc = cras_alsa_pcm_open(&handle,
- dev,
- stream);
- if (rc < 0) {
- syslog(LOG_ERR, "snd_pcm_open_failed: %s", snd_strerror(rc));
- return rc;
- }
-
rc = snd_pcm_hw_params_any(handle, params);
if (rc < 0) {
snd_pcm_close(handle);
@@ -457,8 +448,6 @@ int cras_alsa_fill_properties(const char *dev, snd_pcm_stream_t stream,
}
(*formats)[num_found] = (snd_pcm_format_t)0;
- snd_pcm_close(handle);
-
return 0;
}
diff --git a/cras/src/server/cras_alsa_helpers.h b/cras/src/server/cras_alsa_helpers.h
index 33c33908..3cb98640 100644
--- a/cras/src/server/cras_alsa_helpers.h
+++ b/cras/src/server/cras_alsa_helpers.h
@@ -105,8 +105,7 @@ int cras_alsa_resume_appl_ptr(snd_pcm_t *handle, snd_pcm_uframes_t ahead);
/* Probes properties of the alsa device.
* Args:
- * dev - Path to the alsa device to test.
- * stream - Alsa stream type, input or output.
+ * handle - The open PCM to configure.
* rates - Pointer that will be set to the arrary of valid samples rates.
* Must be freed by the caller.
* channel_counts - Pointer that will be set to the array of valid channel
@@ -116,7 +115,7 @@ int cras_alsa_resume_appl_ptr(snd_pcm_t *handle, snd_pcm_uframes_t ahead);
* Returns:
* 0 on success. On failure an error code from alsa or -ENOMEM.
*/
-int cras_alsa_fill_properties(const char *dev, snd_pcm_stream_t stream,
+int cras_alsa_fill_properties(snd_pcm_t *handle,
size_t **rates, size_t **channel_counts,
snd_pcm_format_t **formats);
diff --git a/cras/src/server/cras_alsa_io.c b/cras/src/server/cras_alsa_io.c
index 80a8c3b3..f67e17f6 100644
--- a/cras/src/server/cras_alsa_io.c
+++ b/cras/src/server/cras_alsa_io.c
@@ -323,6 +323,20 @@ static int open_dev(struct cras_iodev *iodev)
{
struct alsa_io *aio = (struct alsa_io *)iodev;
snd_pcm_t *handle;
+ int rc;
+
+ rc = cras_alsa_pcm_open(&handle, aio->dev, aio->alsa_stream);
+ if (rc < 0)
+ return rc;
+
+ aio->handle = handle;
+
+ return 0;
+}
+
+static int configure_dev(struct cras_iodev *iodev)
+{
+ struct alsa_io *aio = (struct alsa_io *)iodev;
int period_wakeup;
int rc;
@@ -342,39 +356,28 @@ static int open_dev(struct cras_iodev *iodev)
syslog(LOG_DEBUG, "Configure alsa device %s rate %zuHz, %zu channels",
aio->dev, iodev->format->frame_rate,
iodev->format->num_channels);
- handle = 0; /* Avoid unused warning. */
- rc = cras_alsa_pcm_open(&handle, aio->dev, aio->alsa_stream);
- if (rc < 0)
- return rc;
/* If it's a wake on voice device, period_wakeups are required. */
period_wakeup = (iodev->active_node->type == CRAS_NODE_TYPE_HOTWORD);
- rc = cras_alsa_set_hwparams(handle, iodev->format,
+ rc = cras_alsa_set_hwparams(aio->handle, iodev->format,
&iodev->buffer_size, period_wakeup,
aio->dma_period_set_microsecs);
- if (rc < 0) {
- cras_alsa_pcm_close(handle);
+ if (rc < 0)
return rc;
- }
/* Set channel map to device */
- rc = cras_alsa_set_channel_map(handle,
+ rc = cras_alsa_set_channel_map(aio->handle,
iodev->format);
- if (rc < 0) {
- cras_alsa_pcm_close(handle);
+ if (rc < 0)
return rc;
- }
/* Configure software params. */
- rc = cras_alsa_set_swparams(handle, &aio->enable_htimestamp);
- if (rc < 0) {
- cras_alsa_pcm_close(handle);
+ rc = cras_alsa_set_swparams(aio->handle, &aio->enable_htimestamp);
+ if (rc < 0)
return rc;
- }
- /* Assign pcm handle then initialize device settings. */
- aio->handle = handle;
+ /* Initialize device settings. */
init_device_settings(aio);
aio->poll_fd = -1;
@@ -382,7 +385,7 @@ static int open_dev(struct cras_iodev *iodev)
struct pollfd *ufds;
int count, i;
- count = snd_pcm_poll_descriptors_count(handle);
+ count = snd_pcm_poll_descriptors_count(aio->handle);
if (count <= 0) {
syslog(LOG_ERR, "Invalid poll descriptors count\n");
return count;
@@ -392,7 +395,7 @@ static int open_dev(struct cras_iodev *iodev)
if (ufds == NULL)
return -ENOMEM;
- rc = snd_pcm_poll_descriptors(handle, ufds, count);
+ rc = snd_pcm_poll_descriptors(aio->handle, ufds, count);
if (rc < 0) {
syslog(LOG_ERR,
"Getting hotword poll descriptors: %s\n",
@@ -552,7 +555,6 @@ static void update_active_node(struct cras_iodev *iodev, unsigned node_idx,
static int update_channel_layout(struct cras_iodev *iodev)
{
struct alsa_io *aio = (struct alsa_io *)iodev;
- snd_pcm_t *handle = NULL;
snd_pcm_uframes_t buf_size = 0;
int err = 0;
@@ -570,25 +572,14 @@ static int update_channel_layout(struct cras_iodev *iodev)
}
}
- err = cras_alsa_pcm_open(&handle, aio->dev, aio->alsa_stream);
- if (err < 0) {
- syslog(LOG_ERR, "snd_pcm_open_failed: %s", snd_strerror(err));
- return err;
- }
-
/* Sets frame rate and channel count to alsa device before
* we test channel mapping. */
- err = cras_alsa_set_hwparams(handle, iodev->format, &buf_size, 0,
+ err = cras_alsa_set_hwparams(aio->handle, iodev->format, &buf_size, 0,
aio->dma_period_set_microsecs);
- if (err < 0) {
- cras_alsa_pcm_close(handle);
+ if (err < 0)
return err;
- }
-
- err = cras_alsa_get_channel_map(handle, iodev->format);
- cras_alsa_pcm_close(handle);
- return err;
+ return cras_alsa_get_channel_map(aio->handle, iodev->format);
}
static int set_hotword_model(struct cras_iodev *iodev, const char *model_name)
@@ -1569,7 +1560,7 @@ static int update_supported_formats(struct cras_iodev *iodev)
free(iodev->supported_formats);
iodev->supported_formats = NULL;
- err = cras_alsa_fill_properties(aio->dev, aio->alsa_stream,
+ err = cras_alsa_fill_properties(aio->handle,
&iodev->supported_rates,
&iodev->supported_channel_counts,
&iodev->supported_formats);
@@ -1861,6 +1852,7 @@ struct cras_iodev *alsa_iodev_create(size_t card_index,
aio->base.output_underrun = alsa_output_underrun;
}
iodev->open_dev = open_dev;
+ iodev->configure_dev = configure_dev;
iodev->close_dev = close_dev;
iodev->update_supported_formats = update_supported_formats;
iodev->frames_queued = frames_queued;
diff --git a/cras/src/server/cras_bt_io.c b/cras/src/server/cras_bt_io.c
index 1363d90d..c5bdc5fb 100644
--- a/cras/src/server/cras_bt_io.c
+++ b/cras/src/server/cras_bt_io.c
@@ -173,7 +173,7 @@ static int update_supported_formats(struct cras_iodev *iodev)
return 0;
}
-static int open_dev(struct cras_iodev *iodev)
+static int configure_dev(struct cras_iodev *iodev)
{
int rc;
struct cras_iodev *dev = active_profile_dev(iodev);
@@ -183,7 +183,7 @@ static int open_dev(struct cras_iodev *iodev)
/* Fill back the format iodev is using. */
*dev->format = *iodev->format;
- rc = dev->open_dev(dev);
+ rc = dev->configure_dev(dev);
if (rc) {
/* Free format here to assure the update_supported_format
* callback will be called before any future open_dev call. */
@@ -331,7 +331,7 @@ struct cras_iodev *cras_bt_io_create(struct cras_bt_device *device,
iodev->info.stable_id = dev->info.stable_id;
iodev->info.stable_id_new = dev->info.stable_id_new;
- iodev->open_dev = open_dev;
+ iodev->configure_dev = configure_dev;
iodev->frames_queued = frames_queued;
iodev->delay_frames = delay_frames;
iodev->get_buffer = get_buffer;
diff --git a/cras/src/server/cras_empty_iodev.c b/cras/src/server/cras_empty_iodev.c
index 4616cd3c..1e1255cd 100644
--- a/cras/src/server/cras_empty_iodev.c
+++ b/cras/src/server/cras_empty_iodev.c
@@ -93,7 +93,7 @@ static int close_dev(struct cras_iodev *iodev)
return 0;
}
-static int open_dev(struct cras_iodev *iodev)
+static int configure_dev(struct cras_iodev *iodev)
{
struct empty_iodev *empty_iodev = (struct empty_iodev *)iodev;
@@ -196,7 +196,7 @@ struct cras_iodev *empty_iodev_create(enum CRAS_STREAM_DIRECTION direction)
iodev->supported_formats = empty_supported_formats;
iodev->buffer_size = EMPTY_FRAMES;
- iodev->open_dev = open_dev;
+ iodev->configure_dev = configure_dev;
iodev->close_dev = close_dev;
iodev->frames_queued = frames_queued;
iodev->delay_frames = delay_frames;
diff --git a/cras/src/server/cras_hfp_iodev.c b/cras/src/server/cras_hfp_iodev.c
index 10314e63..129f6fc7 100644
--- a/cras/src/server/cras_hfp_iodev.c
+++ b/cras/src/server/cras_hfp_iodev.c
@@ -74,7 +74,7 @@ static void hfp_packet_size_changed(void *data)
cras_bt_device_iodev_buffer_size_changed(hfpio->device);
}
-static int open_dev(struct cras_iodev *iodev)
+static int configure_dev(struct cras_iodev *iodev)
{
struct hfp_io *hfpio = (struct hfp_io *)iodev;
int sk, err, mtu;
@@ -242,7 +242,7 @@ struct cras_iodev *hfp_iodev_create(
strlen(cras_bt_device_object_path(device)));
iodev->info.stable_id_new = iodev->info.stable_id;
- iodev->open_dev= open_dev;
+ iodev->configure_dev= configure_dev;
iodev->frames_queued = frames_queued;
iodev->delay_frames = delay_frames;
iodev->get_buffer = get_buffer;
diff --git a/cras/src/server/cras_iodev.c b/cras/src/server/cras_iodev.c
index 69e65dbf..138a3f4a 100644
--- a/cras/src/server/cras_iodev.c
+++ b/cras/src/server/cras_iodev.c
@@ -820,13 +820,30 @@ unsigned int cras_iodev_max_stream_offset(const struct cras_iodev *iodev)
return max;
}
-int cras_iodev_open(struct cras_iodev *iodev, unsigned int cb_level)
+int cras_iodev_open(struct cras_iodev *iodev, unsigned int cb_level,
+ const struct cras_audio_format *fmt)
{
int rc;
- rc = iodev->open_dev(iodev);
- if (rc < 0)
+ if (iodev->open_dev) {
+ rc = iodev->open_dev(iodev);
+ if (rc)
+ return rc;
+ }
+
+ if (iodev->ext_format == NULL) {
+ rc = cras_iodev_set_format(iodev, fmt);
+ if (rc) {
+ iodev->close_dev(iodev);
+ return rc;
+ }
+ }
+
+ rc = iodev->configure_dev(iodev);
+ if (rc < 0) {
+ iodev->close_dev(iodev);
return rc;
+ }
/* Make sure the min_cb_level doesn't get too large. */
iodev->min_cb_level = MIN(iodev->buffer_size / 2, cb_level);
diff --git a/cras/src/server/cras_iodev.h b/cras/src/server/cras_iodev.h
index 51a00038..3e564ed9 100644
--- a/cras/src/server/cras_iodev.h
+++ b/cras/src/server/cras_iodev.h
@@ -99,6 +99,7 @@ struct cras_ionode {
* set_capture_mute - Function to call if the system capture mute state changes.
* set_swap_mode_for_node - Function to call to set swap mode for the node.
* open_dev - Opens the device.
+ * configure_dev - Configures the device.
* close_dev - Closes the device if it is open.
* update_supported_formats - Refresh supported frame rates and channel counts.
* frames_queued - The number of frames in the audio buffer, and fills tstamp
@@ -179,6 +180,7 @@ struct cras_iodev {
struct cras_ionode *node,
int enable);
int (*open_dev)(struct cras_iodev *iodev);
+ int (*configure_dev)(struct cras_iodev *iodev);
int (*close_dev)(struct cras_iodev *iodev);
int (*update_supported_formats)(struct cras_iodev *iodev);
int (*frames_queued)(const struct cras_iodev *iodev,
@@ -495,7 +497,8 @@ unsigned int cras_iodev_all_streams_written(struct cras_iodev *iodev);
enum CRAS_IODEV_STATE cras_iodev_state(const struct cras_iodev *iodev);
/* Open an iodev, does setup and invokes the open_dev callback. */
-int cras_iodev_open(struct cras_iodev *iodev, unsigned int cb_level);
+int cras_iodev_open(struct cras_iodev *iodev, unsigned int cb_level,
+ const struct cras_audio_format *fmt);
/* Open an iodev, does teardown and invokes the close_dev callback. */
int cras_iodev_close(struct cras_iodev *iodev);
diff --git a/cras/src/server/cras_iodev_list.c b/cras/src/server/cras_iodev_list.c
index b89767ec..0dece3ae 100644
--- a/cras/src/server/cras_iodev_list.c
+++ b/cras/src/server/cras_iodev_list.c
@@ -430,13 +430,7 @@ static int init_device(struct cras_iodev *dev,
if (cras_iodev_is_open(dev))
return 0;
- if (dev->ext_format == NULL) {
- rc = cras_iodev_set_format(dev, &rstream->format);
- if (rc)
- return rc;
- }
-
- rc = cras_iodev_open(dev, rstream->cb_threshold);
+ rc = cras_iodev_open(dev, rstream->cb_threshold, &rstream->format);
if (rc)
return rc;
diff --git a/cras/src/server/cras_loopback_iodev.c b/cras/src/server/cras_loopback_iodev.c
index ff33acaf..d569da81 100644
--- a/cras/src/server/cras_loopback_iodev.c
+++ b/cras/src/server/cras_loopback_iodev.c
@@ -170,7 +170,7 @@ static int close_record_dev(struct cras_iodev *iodev)
return 0;
}
-static int open_record_dev(struct cras_iodev *iodev)
+static int configure_record_dev(struct cras_iodev *iodev)
{
struct loopback_iodev *loopdev = (struct loopback_iodev *)iodev;
struct cras_iodev *edev;
@@ -265,7 +265,7 @@ static struct cras_iodev *create_loopback_iodev(enum CRAS_LOOPBACK_TYPE type)
iodev->frames_queued = frames_queued;
iodev->delay_frames = delay_frames;
iodev->update_active_node = update_active_node;
- iodev->open_dev = open_record_dev;
+ iodev->configure_dev = configure_record_dev;
iodev->close_dev = close_record_dev;
iodev->get_buffer = get_record_buffer;
iodev->put_buffer = put_record_buffer;
diff --git a/cras/src/server/test_iodev.c b/cras/src/server/test_iodev.c
index 4955726e..1db90581 100644
--- a/cras/src/server/test_iodev.c
+++ b/cras/src/server/test_iodev.c
@@ -73,7 +73,7 @@ static int close_dev(struct cras_iodev *iodev)
return 0;
}
-static int open_dev(struct cras_iodev *iodev)
+static int configure_dev(struct cras_iodev *iodev)
{
struct test_iodev *testio = (struct test_iodev *)iodev;
@@ -193,7 +193,7 @@ struct cras_iodev *test_iodev_create(enum CRAS_STREAM_DIRECTION direction,
iodev->supported_formats = test_supported_formats;
iodev->buffer_size = TEST_BUFFER_SIZE;
- iodev->open_dev = open_dev;
+ iodev->configure_dev = configure_dev;
iodev->close_dev = close_dev;
iodev->frames_queued = frames_queued;
iodev->delay_frames = delay_frames;
diff --git a/cras/src/tests/a2dp_iodev_unittest.cc b/cras/src/tests/a2dp_iodev_unittest.cc
index 6e8e3c77..f37fe2e9 100644
--- a/cras/src/tests/a2dp_iodev_unittest.cc
+++ b/cras/src/tests/a2dp_iodev_unittest.cc
@@ -161,7 +161,7 @@ TEST(A2dpIoInit, OpenIodev) {
iodev = a2dp_iodev_create(fake_transport);
iodev_set_format(iodev, &format);
- iodev->open_dev(iodev);
+ iodev->configure_dev(iodev);
ASSERT_EQ(1, cras_bt_transport_acquire_called);
@@ -183,7 +183,7 @@ TEST(A2dpIoInit, GetPutBuffer) {
iodev = a2dp_iodev_create(fake_transport);
iodev_set_format(iodev, &format);
- iodev->open_dev(iodev);
+ iodev->configure_dev(iodev);
ASSERT_NE(write_callback, (void *)NULL);
frames = 256;
@@ -248,7 +248,7 @@ TEST(A2dpIoInif, FramesQueued) {
iodev_set_format(iodev, &format);
time_now.tv_sec = 0;
time_now.tv_nsec = 0;
- iodev->open_dev(iodev);
+ iodev->configure_dev(iodev);
ASSERT_NE(write_callback, (void *)NULL);
frames = 256;
@@ -317,7 +317,7 @@ TEST(A2dpIo, FlushAtLowBufferLevel) {
iodev_set_format(iodev, &format);
time_now.tv_sec = 0;
time_now.tv_nsec = 0;
- iodev->open_dev(iodev);
+ iodev->configure_dev(iodev);
ASSERT_NE(write_callback, (void *)NULL);
ASSERT_EQ(iodev->min_buffer_level, 400);
diff --git a/cras/src/tests/alsa_io_unittest.cc b/cras/src/tests/alsa_io_unittest.cc
index dc58cd75..341361d6 100644
--- a/cras/src/tests/alsa_io_unittest.cc
+++ b/cras/src/tests/alsa_io_unittest.cc
@@ -400,6 +400,8 @@ TEST(AlsaIoInit, OpenPlayback) {
aio->filled_zeros_for_draining = 512;
iodev->open_dev(iodev);
EXPECT_EQ(1, cras_alsa_open_called);
+ iodev->configure_dev(iodev);
+ EXPECT_EQ(1, cras_alsa_open_called);
EXPECT_EQ(1, sys_set_volume_limits_called);
EXPECT_EQ(1, alsa_mixer_set_dBFS_called);
EXPECT_EQ(0, cras_alsa_start_called);
@@ -652,6 +654,8 @@ TEST(AlsaIoInit, OpenCapture) {
ResetStubData();
iodev->open_dev(iodev);
EXPECT_EQ(1, cras_alsa_open_called);
+ iodev->configure_dev(iodev);
+ EXPECT_EQ(1, cras_alsa_open_called);
EXPECT_EQ(1, cras_alsa_mixer_get_minimum_capture_gain_called);
EXPECT_EQ(1, cras_alsa_mixer_get_maximum_capture_gain_called);
EXPECT_EQ(1, sys_set_capture_gain_limits_called);
@@ -694,6 +698,7 @@ TEST(AlsaIoInit, OpenCaptureSetCaptureGainWithDefaultNodeGain) {
sys_get_capture_gain_return_value = system_gain;
iodev->open_dev(iodev);
+ iodev->configure_dev(iodev);
iodev->close_dev(iodev);
// Hardware gain is set to 2000 - 1000 dBm.
@@ -726,6 +731,7 @@ TEST(AlsaIoInit, OpenCaptureSetCaptureGainWithSoftwareGain) {
sys_get_capture_gain_return_value = 1000;
iodev->open_dev(iodev);
+ iodev->configure_dev(iodev);
iodev->close_dev(iodev);
/* Hardware gain is set to 0dB when software gain is used. */
@@ -734,6 +740,7 @@ TEST(AlsaIoInit, OpenCaptureSetCaptureGainWithSoftwareGain) {
/* Test the case where software gain is not needed. */
iodev->active_node->software_volume_needed = 0;
iodev->open_dev(iodev);
+ iodev->configure_dev(iodev);
iodev->close_dev(iodev);
/* Hardware gain is set to 1000dBm as got from system capture gain.*/
@@ -1785,7 +1792,7 @@ TEST_F(AlsaVolumeMuteSuite, GetDefaultVolumeCurve) {
aio_output_->base.format = fmt;
aio_output_->handle = (snd_pcm_t *)0x24;
- rc = aio_output_->base.open_dev(&aio_output_->base);
+ rc = aio_output_->base.configure_dev(&aio_output_->base);
ASSERT_EQ(0, rc);
EXPECT_EQ(&default_curve, fake_get_dBFS_volume_curve_val);
@@ -1820,7 +1827,7 @@ TEST_F(AlsaVolumeMuteSuite, GetVolumeCurveFromNode)
node = aio_output_->base.nodes->next;
aio_output_->base.active_node = node;
- rc = aio_output_->base.open_dev(&aio_output_->base);
+ rc = aio_output_->base.configure_dev(&aio_output_->base);
ASSERT_EQ(0, rc);
EXPECT_EQ(&hp_curve, fake_get_dBFS_volume_curve_val);
@@ -1841,7 +1848,7 @@ TEST_F(AlsaVolumeMuteSuite, SetVolume) {
aio_output_->num_underruns = 3; // Something non-zero.
sys_get_volume_return_value = fake_system_volume;
- rc = aio_output_->base.open_dev(&aio_output_->base);
+ rc = aio_output_->base.configure_dev(&aio_output_->base);
ASSERT_EQ(0, rc);
EXPECT_EQ(1, alsa_mixer_set_dBFS_called);
EXPECT_EQ(fake_system_volume_dB, alsa_mixer_set_dBFS_value);
@@ -2188,8 +2195,7 @@ int cras_alsa_pcm_drain(snd_pcm_t *handle)
{
return 0;
}
-int cras_alsa_fill_properties(const char *dev,
- snd_pcm_stream_t stream,
+int cras_alsa_fill_properties(snd_pcm_t *handle,
size_t **rates,
size_t **channel_counts,
snd_pcm_format_t **formats)
diff --git a/cras/src/tests/audio_thread_unittest.cc b/cras/src/tests/audio_thread_unittest.cc
index e1501260..314b4534 100644
--- a/cras/src/tests/audio_thread_unittest.cc
+++ b/cras/src/tests/audio_thread_unittest.cc
@@ -91,7 +91,7 @@ class StreamDeviceSuite : public testing::Test {
memset(iodev, 0, sizeof(*iodev));
iodev->info.idx = ++device_id_;
iodev->direction = direction;
- iodev->open_dev = open_dev;
+ iodev->configure_dev = configure_dev;
iodev->close_dev = close_dev;
iodev->frames_queued = frames_queued;
iodev->delay_frames = delay_frames;
@@ -133,7 +133,7 @@ class StreamDeviceSuite : public testing::Test {
rstream->pinned_dev_idx = pin_to_dev->info.idx;
}
- static int open_dev(cras_iodev* iodev) {
+ static int configure_dev(cras_iodev* iodev) {
open_dev_called_++;
return 0;
}
@@ -709,7 +709,8 @@ unsigned int cras_iodev_max_stream_offset(const struct cras_iodev *iodev)
return 0;
}
-int cras_iodev_open(struct cras_iodev *iodev, unsigned int cb_level)
+int cras_iodev_open(struct cras_iodev *iodev, unsigned int cb_level,
+ const struct cras_audio_format *fmt)
{
return 0;
}
diff --git a/cras/src/tests/bt_device_unittest.cc b/cras/src/tests/bt_device_unittest.cc
index 4f7cd86c..9f40aed5 100644
--- a/cras/src/tests/bt_device_unittest.cc
+++ b/cras/src/tests/bt_device_unittest.cc
@@ -260,7 +260,9 @@ int hfp_event_speaker_gain(struct hfp_slc_handle *handle, int gain)
/* From iodev_list */
-int cras_iodev_open(struct cras_iodev *dev, unsigned int cb_level) {
+int cras_iodev_open(struct cras_iodev *dev, unsigned int cb_level,
+ const struct cras_audio_format *fmt)
+{
return 0;
}
diff --git a/cras/src/tests/bt_io_unittest.cc b/cras/src/tests/bt_io_unittest.cc
index 979404ac..63073fef 100644
--- a/cras/src/tests/bt_io_unittest.cc
+++ b/cras/src/tests/bt_io_unittest.cc
@@ -62,7 +62,7 @@ class BtIoBasicSuite : public testing::Test {
delay_frames_called_ = 0;
get_buffer_called_ = 0;
put_buffer_called_ = 0;
- open_dev_called_ = 0;
+ configure_dev_called_ = 0;
close_dev_called_ = 0;
}
@@ -77,7 +77,7 @@ class BtIoBasicSuite : public testing::Test {
d->delay_frames = delay_frames;
d->get_buffer = get_buffer;
d->put_buffer = put_buffer;
- d->open_dev = open_dev;
+ d->configure_dev = configure_dev;
d->close_dev = close_dev;
}
@@ -118,8 +118,8 @@ class BtIoBasicSuite : public testing::Test {
put_buffer_called_++;
return 0;
}
- static int open_dev(cras_iodev* iodev) {
- open_dev_called_++;
+ static int configure_dev(cras_iodev* iodev) {
+ configure_dev_called_++;
return 0;
}
static int close_dev(cras_iodev* iodev) {
@@ -135,7 +135,7 @@ class BtIoBasicSuite : public testing::Test {
static unsigned int delay_frames_called_;
static unsigned int get_buffer_called_;
static unsigned int put_buffer_called_;
- static unsigned int open_dev_called_;
+ static unsigned int configure_dev_called_;
static unsigned int close_dev_called_;
};
@@ -147,7 +147,7 @@ unsigned int BtIoBasicSuite::frames_queued_called_;
unsigned int BtIoBasicSuite::delay_frames_called_;
unsigned int BtIoBasicSuite::get_buffer_called_;
unsigned int BtIoBasicSuite::put_buffer_called_;
-unsigned int BtIoBasicSuite::open_dev_called_;
+unsigned int BtIoBasicSuite::configure_dev_called_;
unsigned int BtIoBasicSuite::close_dev_called_;
TEST_F(BtIoBasicSuite, CreateBtIo) {
@@ -164,8 +164,8 @@ TEST_F(BtIoBasicSuite, CreateBtIo) {
bt_iodev->update_supported_formats(bt_iodev);
EXPECT_EQ(1, update_supported_formats_called_);
- bt_iodev->open_dev(bt_iodev);
- EXPECT_EQ(1, open_dev_called_);
+ bt_iodev->configure_dev(bt_iodev);
+ EXPECT_EQ(1, configure_dev_called_);
bt_iodev->frames_queued(bt_iodev, &tstamp);
EXPECT_EQ(1, frames_queued_called_);
bt_iodev->get_buffer(bt_iodev, &fake_area, &fr);
diff --git a/cras/src/tests/hfp_iodev_unittest.cc b/cras/src/tests/hfp_iodev_unittest.cc
index 202bb135..bf13e403 100644
--- a/cras/src/tests/hfp_iodev_unittest.cc
+++ b/cras/src/tests/hfp_iodev_unittest.cc
@@ -116,7 +116,7 @@ TEST(HfpIodev, OpenHfpIodev) {
/* hfp_info not start yet */
hfp_info_running_return_val = 0;
- iodev->open_dev(iodev);
+ iodev->configure_dev(iodev);
ASSERT_EQ(1, cras_bt_device_sco_connect_called);
ASSERT_EQ(1, hfp_info_start_called);
@@ -142,7 +142,7 @@ TEST(HfpIodev, OpenIodevWithHfpInfoAlreadyRunning) {
/* hfp_info already started by another device */
hfp_info_running_return_val = 1;
- iodev->open_dev(iodev);
+ iodev->configure_dev(iodev);
ASSERT_EQ(0, cras_bt_device_sco_connect_called);
ASSERT_EQ(0, hfp_info_start_called);
@@ -164,7 +164,7 @@ TEST(HfpIodev, PutGetBuffer) {
CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY,
fake_info);
iodev->format = &fake_format;
- iodev->open_dev(iodev);
+ iodev->configure_dev(iodev);
hfp_buf_acquire_return_val = 100;
iodev->get_buffer(iodev, &area, &frames);
diff --git a/cras/src/tests/iodev_list_unittest.cc b/cras/src/tests/iodev_list_unittest.cc
index 35b515d4..e5659acf 100644
--- a/cras/src/tests/iodev_list_unittest.cc
+++ b/cras/src/tests/iodev_list_unittest.cc
@@ -1441,7 +1441,8 @@ struct cras_iodev *loopback_iodev_create(enum CRAS_LOOPBACK_TYPE type) {
void loopback_iodev_destroy(struct cras_iodev *iodev) {
}
-int cras_iodev_open(struct cras_iodev *iodev, unsigned int cb_level)
+int cras_iodev_open(struct cras_iodev *iodev, unsigned int cb_level,
+ const struct cras_audio_format *fmt)
{
if (cras_iodev_open_ret[cras_iodev_open_called] == 0)
iodev->state = CRAS_IODEV_STATE_OPEN;
diff --git a/cras/src/tests/iodev_unittest.cc b/cras/src/tests/iodev_unittest.cc
index 29e6e22e..bad8de0b 100644
--- a/cras/src/tests/iodev_unittest.cc
+++ b/cras/src/tests/iodev_unittest.cc
@@ -103,6 +103,7 @@ static unsigned int cras_scale_buffer_increment_frame;
static float cras_scale_buffer_increment_scaler;
static float cras_scale_buffer_increment_increment;
static int cras_scale_buffer_increment_channel;
+static struct cras_audio_format audio_fmt;
// Iodev callback
int update_channel_layout(struct cras_iodev *iodev) {
@@ -194,6 +195,9 @@ void ResetStubData() {
cras_scale_buffer_increment_scaler = 0;
cras_scale_buffer_increment_increment = 0;
cras_scale_buffer_increment_channel = 0;
+ audio_fmt.format = SND_PCM_FORMAT_S16_LE;
+ audio_fmt.frame_rate = 48000;
+ audio_fmt.num_channels = 2;
}
namespace {
@@ -1272,7 +1276,7 @@ TEST(IoDev, GetBufferInvalidFrames) {
EXPECT_EQ(-EINVAL, cras_iodev_get_input_buffer(&iodev, area, &frames));
}
-static int open_dev(struct cras_iodev *iodev) {
+static int configure_dev(struct cras_iodev *iodev) {
iodev->buffer_size = iodev_buffer_size;
return 0;
}
@@ -1281,14 +1285,15 @@ TEST(IoDev, OpenOutputDeviceNoStart) {
struct cras_iodev iodev;
memset(&iodev, 0, sizeof(iodev));
- iodev.open_dev = open_dev;
+ iodev.configure_dev = configure_dev;
iodev.direction = CRAS_STREAM_OUTPUT;
+ iodev.ext_format = &audio_fmt;
ResetStubData();
iodev.state = CRAS_IODEV_STATE_CLOSE;
iodev_buffer_size = 1024;
- cras_iodev_open(&iodev, 240);
+ cras_iodev_open(&iodev, 240, &audio_fmt);
EXPECT_EQ(0, iodev.max_cb_level);
EXPECT_EQ(240, iodev.min_cb_level);
@@ -1304,15 +1309,16 @@ TEST(IoDev, OpenOutputDeviceWithStart) {
struct cras_iodev iodev;
memset(&iodev, 0, sizeof(iodev));
- iodev.open_dev = open_dev;
+ iodev.configure_dev = configure_dev;
iodev.direction = CRAS_STREAM_OUTPUT;
+ iodev.ext_format = &audio_fmt;
ResetStubData();
iodev.state = CRAS_IODEV_STATE_CLOSE;
iodev.start = fake_start;
iodev_buffer_size = 1024;
- cras_iodev_open(&iodev, 240);
+ cras_iodev_open(&iodev, 240, &audio_fmt);
EXPECT_EQ(0, iodev.max_cb_level);
EXPECT_EQ(240, iodev.min_cb_level);
@@ -1324,14 +1330,15 @@ TEST(IoDev, OpenInputDeviceNoStart) {
struct cras_iodev iodev;
memset(&iodev, 0, sizeof(iodev));
- iodev.open_dev = open_dev;
+ iodev.configure_dev = configure_dev;
iodev.direction = CRAS_STREAM_INPUT;
+ iodev.ext_format = &audio_fmt;
ResetStubData();
iodev.state = CRAS_IODEV_STATE_CLOSE;
iodev_buffer_size = 1024;
- cras_iodev_open(&iodev, 240);
+ cras_iodev_open(&iodev, 240, &audio_fmt);
EXPECT_EQ(0, iodev.max_cb_level);
EXPECT_EQ(240, iodev.min_cb_level);
@@ -1343,15 +1350,16 @@ TEST(IoDev, OpenInputDeviceWithStart) {
struct cras_iodev iodev;
memset(&iodev, 0, sizeof(iodev));
- iodev.open_dev = open_dev;
+ iodev.configure_dev = configure_dev;
iodev.direction = CRAS_STREAM_INPUT;
+ iodev.ext_format = &audio_fmt;
ResetStubData();
iodev.state = CRAS_IODEV_STATE_CLOSE;
iodev.start = fake_start;
iodev_buffer_size = 1024;
- cras_iodev_open(&iodev, 240);
+ cras_iodev_open(&iodev, 240, &audio_fmt);
EXPECT_EQ(0, iodev.max_cb_level);
EXPECT_EQ(240, iodev.min_cb_level);
@@ -1372,8 +1380,9 @@ TEST(IoDev, AddRmStream) {
struct dev_stream stream1, stream2;
memset(&iodev, 0, sizeof(iodev));
- iodev.open_dev = open_dev;
+ iodev.configure_dev = configure_dev;
iodev.no_stream = simple_no_stream;
+ iodev.ext_format = &audio_fmt;
iodev.state = CRAS_IODEV_STATE_NORMAL_RUN;
rstream1.cb_threshold = 800;
stream1.stream = &rstream1;
@@ -1382,7 +1391,7 @@ TEST(IoDev, AddRmStream) {
ResetStubData();
iodev_buffer_size = 1024;
- cras_iodev_open(&iodev, rstream1.cb_threshold);
+ cras_iodev_open(&iodev, rstream1.cb_threshold, &audio_fmt);
EXPECT_EQ(0, iodev.max_cb_level);
EXPECT_EQ(512, iodev.min_cb_level);
@@ -1523,13 +1532,13 @@ TEST(IoDev, PrepareOutputBeforeWriteSamples) {
iodev.direction = CRAS_STREAM_OUTPUT;
iodev.buffer_size = BUFFER_SIZE;
iodev.no_stream = no_stream;
- iodev.open_dev = open_dev;
+ iodev.configure_dev = configure_dev;
iodev.start = fake_start;
iodev.info = info;
iodev_buffer_size = BUFFER_SIZE;
// Open device.
- cras_iodev_open(&iodev, rstream1.cb_threshold);
+ cras_iodev_open(&iodev, rstream1.cb_threshold, &fmt);
// Add one stream to device.
cras_iodev_add_stream(&iodev, &stream1);
@@ -1892,14 +1901,15 @@ TEST(IoDev, RequestReset) {
ResetStubData();
- iodev.open_dev = open_dev;
+ iodev.configure_dev = configure_dev;
iodev.direction = CRAS_STREAM_OUTPUT;
+ iodev.ext_format = &audio_fmt;
iodev.state = CRAS_IODEV_STATE_CLOSE;
iodev_buffer_size = 1024;
// Open device.
- cras_iodev_open(&iodev, 240);
+ cras_iodev_open(&iodev, 240, &audio_fmt);
// The first reset request works.
EXPECT_EQ(0, cras_iodev_reset_request(&iodev));
@@ -1910,7 +1920,7 @@ TEST(IoDev, RequestReset) {
EXPECT_EQ(1, device_monitor_reset_device_called);
// Assume device is opened again.
- cras_iodev_open(&iodev, 240);
+ cras_iodev_open(&iodev, 240, &audio_fmt);
// The reset request works.
EXPECT_EQ(0, cras_iodev_reset_request(&iodev));
diff --git a/cras/src/tests/loopback_iodev_unittest.cc b/cras/src/tests/loopback_iodev_unittest.cc
index b0387bfd..e213dc2f 100644
--- a/cras/src/tests/loopback_iodev_unittest.cc
+++ b/cras/src/tests/loopback_iodev_unittest.cc
@@ -76,7 +76,7 @@ TEST_F(LoopBackTestSuite, InstallLoopHook) {
enabled_dev = &iodev;
// Open loopback devices.
- EXPECT_EQ(0, loop_in_->open_dev(loop_in_));
+ EXPECT_EQ(0, loop_in_->configure_dev(loop_in_));
EXPECT_EQ(1, cras_iodev_list_set_device_enabled_callback_called);
// Signal an output device is enabled.
@@ -106,7 +106,7 @@ TEST_F(LoopBackTestSuite, OpenIdleSystem) {
time_now.tv_sec = 100;
time_now.tv_nsec = 0;
- EXPECT_EQ(0, loop_in_->open_dev(loop_in_));
+ EXPECT_EQ(0, loop_in_->configure_dev(loop_in_));
EXPECT_EQ(1, cras_iodev_list_set_device_enabled_callback_called);
// Should be 480 samples after 480/frame rate seconds
@@ -139,7 +139,7 @@ TEST_F(LoopBackTestSuite, SimpleLoopback) {
iodev.streams = &stream;
enabled_dev = &iodev;
- loop_in_->open_dev(loop_in_);
+ loop_in_->configure_dev(loop_in_);
ASSERT_NE(reinterpret_cast<void *>(NULL), loop_hook);
// Loopback callback for the hook.