Support 24bit sample format and up-to 192kHz sample rate 97/183897/4 accepted/tizen/unified/20180814.063205 submit/tizen/20180810.072258
authorSeungbae Shin <seungbae.shin@samsung.com>
Mon, 4 Jun 2018 10:03:44 +0000 (19:03 +0900)
committerSeungbae Shin <seungbae.shin@samsung.com>
Wed, 8 Aug 2018 07:01:57 +0000 (16:01 +0900)
[Version] 0.5.9
[Issue Type] Enhancement

Change-Id: I1f5dafa187781e60041ce6667cdc66c156466076

include/CAudioInfo.h
include/audio_io.h
packaging/capi-media-audio-io.spec
src/cpp/CAudioInfo.cpp
src/cpp/CPulseStreamSpec.cpp
src/cpp/cpp_audio_io.cpp
test/audio_io_test.c

index 5f3fb13..8c674aa 100644 (file)
@@ -43,6 +43,8 @@ namespace tizen_media_audio {
         enum class ESampleType : unsigned int {
             SAMPLE_TYPE_U8 = 1,             /**< Unsigned 8-bit audio samples */
             SAMPLE_TYPE_S16_LE,             /**< Signed 16-bit audio samples */
+            SAMPLE_TYPE_S24_LE,             /**< Signed 24-bit audio samples */
+            SAMPLE_TYPE_S24_32_LE,          /**< Signed 24-bit packed in 32-bit audio samples */
             SAMPLE_TYPE_MAX
         };
 
@@ -101,7 +103,7 @@ namespace tizen_media_audio {
         };
 
         const static unsigned int MIN_SYSTEM_SAMPLERATE = 8000;
-        const static unsigned int MAX_SYSTEM_SAMPLERATE = 48000;
+        const static unsigned int MAX_SYSTEM_SAMPLERATE = 192000;
 
         /* Constructors */
         CAudioInfo();
index 92b2573..85ea8cb 100644 (file)
@@ -72,6 +72,8 @@ typedef struct audio_io_s *audio_out_h;
 typedef enum {
        AUDIO_SAMPLE_TYPE_U8 = 0x70,    /**< Unsigned 8-bit audio samples */
        AUDIO_SAMPLE_TYPE_S16_LE,       /**< Signed 16-bit audio samples */
+       AUDIO_SAMPLE_TYPE_S24_LE,       /**< Signed 24-bit audio samples (Since 5.0) */
+       AUDIO_SAMPLE_TYPE_S24_32_LE,    /**< Signed 24-bit (packed in 32-bit) audio samples (Since 5.0) */
 } audio_sample_type_e;
 
 /**
@@ -164,7 +166,7 @@ typedef void (*audio_in_state_changed_cb)(audio_in_h handle, audio_io_state_e pr
  *
  * @remarks @a input must be released using audio_in_destroy().
  *
- * @param[in] sample_rate The audio sample rate in 8000[Hz] ~ 48000[Hz]
+ * @param[in] sample_rate The audio sample rate in 8000[Hz] ~ 48000[Hz] (Before 5.0), 8000[Hz] ~ 192000[Hz] (Since 5.0)
  * @param[in] channel The audio channel type (mono or stereo)
  * @param[in] type The type of audio sample (8- or 16-bit)
  * @param[out] input An audio input handle is created on success
@@ -362,7 +364,7 @@ int audio_in_get_buffer_size(audio_in_h input, int *size);
  * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] input The handle to the audio input
- * @param[out] sample_rate The audio sample rate in Hertz (8000 ~ 48000)
+ * @param[out] sample_rate The audio sample rate in Hertz (8000 ~ 48000) (Before 5.0), (8000 ~ 192000) (Since 5.0)
  * @return @c 0 on success,
  *         otherwise a negative error value
  * @retval #AUDIO_IO_ERROR_NONE Successful
@@ -581,7 +583,7 @@ typedef void (*audio_out_state_changed_cb)(audio_out_h handle, audio_io_state_e
  * @remarks @a output must be released by audio_out_destroy().
  *          It is recommended to call audio_out_set_sound_stream_info() after this API.
  *
- * @param[in] sample_rate The audio sample rate in 8000[Hz] ~ 48000[Hz]
+ * @param[in] sample_rate The audio sample rate in 8000[Hz] ~ 48000[Hz] (Before 5.0), 8000[Hz] ~ 192000[Hz] (Since 5.0)
  * @param[in] channel The audio channel type (mono or stereo)
  * @param[in] type The type of audio sample (8-bit or 16-bit)
  * @param[out] output An audio output handle is created on success
@@ -790,7 +792,7 @@ int audio_out_get_buffer_size(audio_out_h output, int *size);
  * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] output The handle to the audio output
- * @param[out] sample_rate The audio sample rate in Hertz (8000 ~ 48000)
+ * @param[out] sample_rate The audio sample rate in Hertz (8000 ~ 48000) (Before 5.0), (8000 ~ 192000) (Since 5.0)
  * @return  @c 0 on success,
  *          otherwise a negative error value
  * @retval  #AUDIO_IO_ERROR_NONE Successful
index 18656f6..baec8b5 100644 (file)
@@ -1,6 +1,6 @@
 Name:           capi-media-audio-io
 Summary:        An Audio Input & Audio Output library in Tizen Native API
-Version:        0.5.8
+Version:        0.5.9
 Release:        0
 Group:          Multimedia/API
 License:        Apache-2.0
index 503a1c5..c02f0f4 100644 (file)
@@ -99,6 +99,12 @@ int CAudioInfo::getSampleSize() {
     case ESampleType::SAMPLE_TYPE_S16_LE:
         bytes_in_sample = 2;
         break;
+    case ESampleType::SAMPLE_TYPE_S24_LE:
+        bytes_in_sample = 3;
+        break;
+    case ESampleType::SAMPLE_TYPE_S24_32_LE:
+        bytes_in_sample = 4;
+        break;
     default:
         AUDIO_IO_LOGW("As unrecognized sample type %d, let's assume S16_LE", static_cast<int>(__mSampleType));
         bytes_in_sample = 2;
index 380935f..92dc4c8 100644 (file)
@@ -89,6 +89,17 @@ void CPulseStreamSpec::__adjustSpec() {
         break;
 
     case CAudioInfo::ESampleType::SAMPLE_TYPE_S16_LE:
+        __mSampleSpec.format = PA_SAMPLE_S16LE;
+        break;
+
+    case CAudioInfo::ESampleType::SAMPLE_TYPE_S24_LE:
+        __mSampleSpec.format = PA_SAMPLE_S24LE;
+        break;
+
+    case CAudioInfo::ESampleType::SAMPLE_TYPE_S24_32_LE:
+        __mSampleSpec.format = PA_SAMPLE_S24_32LE;
+        break;
+
     default:
         __mSampleSpec.format = PA_SAMPLE_S16LE;
         break;
index 461291b..8df8dde 100644 (file)
@@ -174,6 +174,12 @@ static void __convert_sample_type_2_audio_info_sample_type(const audio_sample_ty
     case AUDIO_SAMPLE_TYPE_S16_LE:
         dst_type = CAudioInfo::ESampleType::SAMPLE_TYPE_S16_LE;
         break;
+    case AUDIO_SAMPLE_TYPE_S24_LE:
+        dst_type = CAudioInfo::ESampleType::SAMPLE_TYPE_S24_LE;
+        break;
+    case AUDIO_SAMPLE_TYPE_S24_32_LE:
+        dst_type = CAudioInfo::ESampleType::SAMPLE_TYPE_S24_32_LE;
+        break;
     default:
         dst_type = CAudioInfo::ESampleType::SAMPLE_TYPE_U8;
         break;
@@ -189,6 +195,12 @@ static void __convert_audio_info_sample_type_2_sample_type(const CAudioInfo::ESa
     case CAudioInfo::ESampleType::SAMPLE_TYPE_S16_LE:
         dst_type = AUDIO_SAMPLE_TYPE_S16_LE;
         break;
+    case CAudioInfo::ESampleType::SAMPLE_TYPE_S24_LE:
+        dst_type = AUDIO_SAMPLE_TYPE_S24_LE;
+        break;
+    case CAudioInfo::ESampleType::SAMPLE_TYPE_S24_32_LE:
+        dst_type = AUDIO_SAMPLE_TYPE_S24_32_LE;
+        break;
     default:
         dst_type = AUDIO_SAMPLE_TYPE_U8;
         break;
@@ -289,7 +301,10 @@ static void __check_audio_param(int sample_rate, audio_channel_e channel, audio_
     if (channel != AUDIO_CHANNEL_MONO && channel != AUDIO_CHANNEL_STEREO)
         THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT, "Invalid channel :%d", channel);
 
-    if (type != AUDIO_SAMPLE_TYPE_U8 && type != AUDIO_SAMPLE_TYPE_S16_LE)
+    if (type != AUDIO_SAMPLE_TYPE_U8 &&
+        type != AUDIO_SAMPLE_TYPE_S16_LE &&
+        type != AUDIO_SAMPLE_TYPE_S24_LE &&
+        type != AUDIO_SAMPLE_TYPE_S24_32_LE)
         THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT, "Invalid sample type :%d", type);
 }
 
index 61ea8eb..0d9ba34 100644 (file)
@@ -127,10 +127,7 @@ void play_file_sample(char *file, int frequency, int ch, int type)
        fseek(fp, 0, SEEK_SET);
 
        printf("start to play [%s] of size [%d] with [%d][%d][%d]\n", file, file_size, frequency, ch, type);
-       if (type)
-               audio_out_create_new(frequency, ch_table[ch], AUDIO_SAMPLE_TYPE_S16_LE, &output);
-       else
-               audio_out_create_new(frequency, ch_table[ch], AUDIO_SAMPLE_TYPE_U8, &output);
+       audio_out_create_new(frequency, ch_table[ch], AUDIO_SAMPLE_TYPE_U8 + type, &output);
 
        audio_out_prepare(output);
        audio_out_get_buffer_size(output, &buffer_size);
@@ -676,7 +673,7 @@ int main(int argc, char **argv)
                printf("2. usage : audio_io_test call-forwarding-in\n");
                printf("3. usage : audio_io_test [length to read] [number of iteration] [channels]\n");
                printf("4. usage : audio_io_test async [write(1) | read(2)]\n");
-               printf("5. Uasge : audio_io_test play [filename] [sample rate] [channels] [type(0:U8)]\n");
+               printf("5. Uasge : audio_io_test play [filename] [sample rate] [channels] [type(0:U8,1:S16LE,2:S24LE,3:S24_32LE)]\n");
        }
        return 0;
 }