Card and device arguments are added to pcm open API 82/184682/1 accepted/tizen_5.0_unified tizen_5.0 accepted/tizen/5.0/unified/20181102.011955 accepted/tizen/unified/20180726.064835 submit/tizen/20180724.034640 submit/tizen_5.0/20181101.000001
authorJungsup Lee <jungsup4.lee@samsung.com>
Tue, 26 Jun 2018 05:38:32 +0000 (14:38 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Fri, 20 Jul 2018 06:48:38 +0000 (15:48 +0900)
[Version] 0.1.1
[Issue Type] API

Change-Id: Ia1ba2a63b3aa3212e756debf548611046ebb9495
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
packaging/audio-hal-bcm2837.spec
tizen-audio-impl-pcm.c
tizen-audio-impl.h
tizen-audio-internal.h
tizen-audio-pcm.c
tizen-audio.h

index dc25b07..c6090e4 100644 (file)
@@ -1,6 +1,6 @@
 Name:       audio-hal-bcm2837
 Summary:    TIZEN Audio HAL for BCM2837
-Version:    0.1.0
+Version:    0.1.1
 Release:    0
 Group:      System/Libraries
 License:    Apache-2.0
index 273004d..6628e4e 100644 (file)
 #include "tizen-audio-internal.h"
 #include "tizen-audio-impl.h"
 
+#ifndef __USE_TINYALSA__
+#define DEVICE_NAME_MAX 32
+#endif
+
 #ifdef __USE_TINYALSA__
 /* Convert pcm format from pulse to alsa */
 static const uint32_t g_format_convert_table[] = {
@@ -66,11 +70,27 @@ static uint32_t __convert_format(audio_sample_format_t format)
 /* #define DEBUG_TIMING */
 
 #ifdef __USE_TINYALSA__
-static struct pcm *__tinyalsa_open_device(audio_pcm_sample_spec_t *ss, size_t period_size, size_t period_count, uint32_t direction)
+static int __parse_card_device_number(const char *card, const char *device, unsigned int *card_u, unsigned int *device_u) {
+    AUDIO_RETURN_VAL_IF_FAIL(card, AUDIO_ERR_PARAMETER);
+    AUDIO_RETURN_VAL_IF_FAIL(device, AUDIO_ERR_PARAMETER);
+    AUDIO_RETURN_VAL_IF_FAIL(card_u, AUDIO_ERR_PARAMETER);
+    AUDIO_RETURN_VAL_IF_FAIL(device_u, AUDIO_ERR_PARAMETER);
+
+    AUDIO_LOG_DEBUG("card : %s, device : %s", card, device);
+
+    *card_u = (unsigned int) strtol(card, NULL, 10);
+    *device_u = (unsigned int) strtol(device, NULL, 10);
+
+    return 0;
+}
+
+static struct pcm *__tinyalsa_open_device(const char *card, const char *device, audio_pcm_sample_spec_t *ss, size_t period_size, size_t period_count, uint32_t direction)
 {
     struct pcm *pcm = NULL;
     struct pcm_config config;
+    unsigned int card_u, device_u;
 
+    AUDIO_RETURN_NULL_IF_FAIL(device);
     AUDIO_RETURN_NULL_IF_FAIL(ss);
 
     config.channels          = ss->channels;
@@ -82,12 +102,15 @@ static struct pcm *__tinyalsa_open_device(audio_pcm_sample_spec_t *ss, size_t pe
     config.stop_threshold    = 0xFFFFFFFF;
     config.silence_threshold = 0;
 
-    AUDIO_LOG_INFO("direction %d, channels %d, rate %d, format %d, period_size %d, period_count %d", direction, ss->channels, ss->rate, ss->format, period_size, period_count);
+    AUDIO_LOG_INFO("card %s, device %s, direction %d, channels %d, rate %d, format %d, period_size %d, period_count %d",
+        card, device, direction, ss->channels, ss->rate, ss->format, period_size, period_count);
+
+    if (__parse_card_device_number(card, device, &card_u, &device_u) < 0) {
+        AUDIO_LOG_ERROR("Failed to get card device number from %s", device);
+        return NULL;
+    }
 
-    pcm = pcm_open((direction == AUDIO_DIRECTION_OUT) ? PLAYBACK_CARD_ID : CAPTURE_CARD_ID,
-                   (direction == AUDIO_DIRECTION_OUT) ? PLAYBACK_PCM_DEVICE_ID : CAPTURE_PCM_DEVICE_ID,
-                   (direction == AUDIO_DIRECTION_OUT) ? PCM_OUT : PCM_IN,
-                   &config);
+    pcm = pcm_open(card_u, device_u, (direction == AUDIO_DIRECTION_OUT) ? PCM_OUT : PCM_IN, &config);
     if (!pcm || !pcm_is_ready(pcm)) {
         AUDIO_LOG_ERROR("Unable to open device (%s)", pcm_get_error(pcm));
         pcm_close(pcm);
@@ -121,16 +144,37 @@ static int __tinyalsa_pcm_recover(struct pcm *pcm, int err)
 }
 #endif
 
-audio_return_t _pcm_open(void **pcm_handle, uint32_t direction, void *sample_spec, uint32_t period_size, uint32_t periods)
+#ifndef __USE_TINYALSA__
+static int __make_alsa_device_name(const char *card, const char *device, char device_name[])
 {
+    AUDIO_RETURN_VAL_IF_FAIL(card, AUDIO_ERR_PARAMETER);
+    AUDIO_RETURN_VAL_IF_FAIL(device, AUDIO_ERR_PARAMETER);
+    AUDIO_RETURN_VAL_IF_FAIL(device_name, AUDIO_ERR_PARAMETER);
+
+    snprintf(device_name, DEVICE_NAME_MAX, "hw:%s,%s", card, device);
+    return 0;
+}
+#endif
+
+audio_return_t _pcm_open(const char *card, const char *device, uint32_t direction, void *sample_spec,
+        uint32_t period_size, uint32_t periods, void **pcm_handle)
+{
+    int err;
+
+    AUDIO_RETURN_VAL_IF_FAIL(card, AUDIO_ERR_PARAMETER);
+    AUDIO_RETURN_VAL_IF_FAIL(device, AUDIO_ERR_PARAMETER);
+    AUDIO_RETURN_VAL_IF_FAIL((direction == AUDIO_DIRECTION_OUT) || (direction == AUDIO_DIRECTION_IN),
+                            AUDIO_ERR_PARAMETER);
+
+    AUDIO_LOG_INFO("card(%s) device(%s) direction(%u) period_size(%u) periods(%u)",
+                    card, device, direction, period_size, periods);
 #ifdef __USE_TINYALSA__
     audio_pcm_sample_spec_t *ss;
-    int err;
 
     ss = (audio_pcm_sample_spec_t *)sample_spec;
     ss->format = __convert_format((audio_sample_format_t)ss->format);
 
-    *pcm_handle = __tinyalsa_open_device(ss, (size_t)period_size, (size_t)periods, direction);
+    *pcm_handle = __tinyalsa_open_device(card, device, ss, (size_t)period_size, (size_t)periods, direction);
     if (*pcm_handle == NULL) {
         AUDIO_LOG_ERROR("Error opening PCM device");
         return AUDIO_ERR_RESOURCE;
@@ -141,28 +185,21 @@ audio_return_t _pcm_open(void **pcm_handle, uint32_t direction, void *sample_spe
     }
 
 #else  /* alsa-lib */
-    int err, mode;
-    char *device_name = NULL;
+    int mode;
+    audio_return_t ret;
+    char device_name[DEVICE_NAME_MAX];
 
+    __make_alsa_device_name(card, device, device_name);
     mode =  SND_PCM_NONBLOCK | SND_PCM_NO_AUTO_RESAMPLE | SND_PCM_NO_AUTO_CHANNELS | SND_PCM_NO_AUTO_FORMAT;
 
-    if (direction == AUDIO_DIRECTION_OUT)
-        device_name = PLAYBACK_PCM_DEVICE;
-    else if (direction == AUDIO_DIRECTION_IN)
-        device_name = CAPTURE_PCM_DEVICE;
-    else {
-        AUDIO_LOG_ERROR("Error get device_name, direction : %d", direction);
-        return AUDIO_ERR_RESOURCE;
-    }
-
     if ((err = snd_pcm_open((snd_pcm_t **)pcm_handle, device_name, (direction == AUDIO_DIRECTION_OUT) ? SND_PCM_STREAM_PLAYBACK : SND_PCM_STREAM_CAPTURE, mode)) < 0) {
         AUDIO_LOG_ERROR("Error opening PCM device %s : %s", device_name, snd_strerror(err));
         return AUDIO_ERR_RESOURCE;
     }
 
-    if ((err = _pcm_set_params(*pcm_handle, direction, sample_spec, period_size, periods)) != AUDIO_RET_OK) {
-        AUDIO_LOG_ERROR("Failed to set pcm parameters : %d", err);
-        return err;
+    if ((ret = _pcm_set_params(*pcm_handle, direction, sample_spec, period_size, periods)) != AUDIO_RET_OK) {
+        AUDIO_LOG_ERROR("Failed to set pcm parameters : %d", ret);
+        return ret;
     }
 
     AUDIO_LOG_INFO("PCM device %s", device_name);
@@ -546,12 +583,12 @@ audio_return_t _pcm_set_params(void *pcm_handle, uint32_t direction, void *sampl
     }
 
     if ((err = snd_pcm_hw_params_set_channels(pcm_handle, hwparams, ss.channels)) < 0) {
-               AUDIO_LOG_ERROR("snd_pcm_hw_params_set_channels(%u) failed : %d", ss.channels, err);
+        AUDIO_LOG_ERROR("snd_pcm_hw_params_set_channels(%u) failed : %d", ss.channels, err);
         return AUDIO_ERR_PARAMETER;
     }
 
     if ((err = snd_pcm_hw_params_set_period_size(pcm_handle, hwparams, period_size, 0)) < 0) {
-               AUDIO_LOG_ERROR("snd_pcm_hw_params_set_period_size(%u) failed : %d", period_size,err);
+        AUDIO_LOG_ERROR("snd_pcm_hw_params_set_period_size(%u) failed : %d", period_size, err);
         return AUDIO_ERR_PARAMETER;
     }
 
@@ -562,7 +599,7 @@ audio_return_t _pcm_set_params(void *pcm_handle, uint32_t direction, void *sampl
 
     _buffer_size = period_size * periods;
     if ((err = snd_pcm_hw_params_set_buffer_size(pcm_handle, hwparams, _buffer_size)) < 0) {
-        AUDIO_LOG_ERROR("snd_pcm_hw_params_set_buffer_size(%u) failed : %d", periods * periods, err);
+        AUDIO_LOG_ERROR("snd_pcm_hw_params_set_buffer_size(%u) failed : %d", _buffer_size, err);
         return AUDIO_ERR_PARAMETER;
     }
 
index 4287ac8..b7ece02 100644 (file)
@@ -21,7 +21,7 @@
  */
 
 /* PCM */
-audio_return_t _pcm_open(void **pcm_handle, uint32_t direction, void *sample_spec, uint32_t period_size, uint32_t periods);
+audio_return_t _pcm_open(const char *card, const char *device, uint32_t direction, void *sample_spec, uint32_t period_size, uint32_t periods, void **pcm_handle);
 audio_return_t _pcm_start(void *pcm_handle);
 audio_return_t _pcm_stop(void *pcm_handle);
 audio_return_t _pcm_close(void *pcm_handle);
index 7fa706c..8f2f2f9 100644 (file)
@@ -124,16 +124,6 @@ typedef struct device_type {
 #define strneq strcmp
 
 #define ALSA_DEFAULT_CARD       "bcm2835"
-#define PLAYBACK_PCM_DEVICE     "hw:1,0"
-#define CAPTURE_PCM_DEVICE      "hw:0,0"
-
-/* hw:0,0 */
-#define PLAYBACK_CARD_ID        0
-#define PLAYBACK_PCM_DEVICE_ID  0
-
-/* hw:0,0 */
-#define CAPTURE_CARD_ID         0
-#define CAPTURE_PCM_DEVICE_ID   0
 
 #define MAX_DEVICES             5
 #define MAX_MODIFIERS           5
index 0a09cba..b18ad7e 100644 (file)
@@ -45,7 +45,8 @@ audio_return_t _audio_pcm_deinit(audio_hal_t *ah)
     return AUDIO_RET_OK;
 }
 
-audio_return_t audio_pcm_open(void *audio_handle, void **pcm_handle, uint32_t direction, void *sample_spec, uint32_t period_size, uint32_t periods)
+audio_return_t audio_pcm_open(void *audio_handle, const char *card, const char *device, uint32_t direction, void *sample_spec,
+        uint32_t period_size, uint32_t periods, void **pcm_handle)
 {
     audio_return_t audio_ret = AUDIO_RET_OK;
     audio_hal_t *ah = NULL;
@@ -56,12 +57,12 @@ audio_return_t audio_pcm_open(void *audio_handle, void **pcm_handle, uint32_t di
     AUDIO_RETURN_VAL_IF_FAIL((period_size > 0), AUDIO_ERR_PARAMETER);
     AUDIO_RETURN_VAL_IF_FAIL((periods > 0), AUDIO_ERR_PARAMETER);
 
-    if ((audio_ret = _pcm_open(pcm_handle, direction, sample_spec, period_size, periods)))
+    if ((audio_ret = _pcm_open(card, device, direction, sample_spec, period_size, periods, pcm_handle)))
         return audio_ret;
 
     ah = (audio_hal_t*)audio_handle;
     ah->device.pcm_count++;
-    AUDIO_LOG_INFO("Opening PCM handle 0x%x", *pcm_handle);
+    AUDIO_LOG_INFO("Opening PCM handle 0x%x", (unsigned int)*pcm_handle);
 
     return AUDIO_RET_OK;
 }
@@ -200,4 +201,4 @@ audio_return_t audio_pcm_set_params(void *audio_handle, void *pcm_handle, uint32
     audio_ret = _pcm_set_params(pcm_handle, direction, sample_spec, period_size, periods);
 
     return audio_ret;
-}
\ No newline at end of file
+}
index 282f7f0..d752d89 100644 (file)
@@ -125,7 +125,7 @@ typedef struct audio_interface {
     /* Stream */
     audio_return_t (*notify_stream_connection_changed)(void *audio_handle, audio_stream_info_t *info, uint32_t is_connected);
     /* PCM */
-    audio_return_t (*pcm_open)(void *audio_handle, void **pcm_handle, uint32_t direction, void *sample_spec, uint32_t period_size, uint32_t periods);
+    audio_return_t (*pcm_open)(void *audio_handle, const char *card, const char *device, uint32_t direction, void *sample_spec, uint32_t period_size, uint32_t periods, void **pcm_handle);
     audio_return_t (*pcm_start)(void *audio_handle, void *pcm_handle);
     audio_return_t (*pcm_stop)(void *audio_handle, void *pcm_handle);
     audio_return_t (*pcm_close)(void *audio_handle, void *pcm_handle);
@@ -303,18 +303,20 @@ audio_return_t audio_notify_stream_connection_changed(void *audio_handle, audio_
  * @brief Opens a PCM device.
  * @since_tizen 3.0
  * @param[in] audio_handle The audio hal handle
- * @param[out] pcm_handle The PCM handle
+ * @param[in] card The card of PCM
+ * @param[in] device The device of PCM
  * @param[in] direction The direction of PCM
  * @param[in] sample_spec The sample specification
  * @param[in] period_size The period size
  * @param[in] periods The periods
+ * @param[out] pcm_handle The PCM handle
  *
  * @return @c 0 on success,
  *         otherwise a negative error value
  * @retval #AUDIO_RET_OK Success
  * @see audio_pcm_close()
  */
-audio_return_t audio_pcm_open(void *audio_handle, void **pcm_handle, uint32_t direction, void *sample_spec, uint32_t period_size, uint32_t periods);
+audio_return_t audio_pcm_open(void *audio_handle, const char *card, const char *device, uint32_t direction, void *sample_spec, uint32_t period_size, uint32_t periods, void **pcm_handle);
 
 /**
  * @brief Starts a PCM device.