diff options
author | Sho Amano <samano@xevo.com> | 2020-06-30 19:52:27 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-30 06:52:27 -0400 |
commit | ab5604731c6445776081f8f9e053a031545f9167 (patch) | |
tree | 0fa4f2c6688df5cd66cd53b0a145188ba4116649 /src/components | |
parent | 9f18265c848f778ca580b02b9abebd96c09eaba9 (diff) | |
download | sdl_core-ab5604731c6445776081f8f9e053a031545f9167.tar.gz |
Fix/sdl 491 apt support formats (#2184)
* Move definitions of SamplingRate / AudioCaptureQuality / AudioType to public header
* Transfer AudioPassThru configuration to adapter
* fix: apply AudioPassThru config to GStreamer pipeline
* Update media manager test to remove deprecated method
* Reflect code review comments
- Update Doxygen comment format
- Add description of create_caps_string() method
* Fix style issue in from_mic_recorder_adapter.h
* Update MediaManager to use Mobile API audio related enums
Reflecting review comments.
Diffstat (limited to 'src/components')
12 files changed, 192 insertions, 41 deletions
diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc index 009052bc72..bd3f4b5f08 100644 --- a/src/components/application_manager/src/application_manager_impl.cc +++ b/src/components/application_manager/src/application_manager_impl.cc @@ -1472,7 +1472,12 @@ void ApplicationManagerImpl::StartAudioPassThruThread(int32_t session_key, LOG4CXX_INFO(logger_, "START MICROPHONE RECORDER"); DCHECK_OR_RETURN_VOID(media_manager_); media_manager_->StartMicrophoneRecording( - session_key, get_settings().recording_file_name(), max_duration); + session_key, + get_settings().recording_file_name(), + max_duration, + static_cast<mobile_apis::SamplingRate::eType>(sampling_rate), + static_cast<mobile_apis::BitsPerSample::eType>(bits_per_sample), + static_cast<mobile_apis::AudioType::eType>(audio_type)); } void ApplicationManagerImpl::StopAudioPassThru(int32_t application_key) { diff --git a/src/components/application_manager/test/application_manager_impl_test.cc b/src/components/application_manager/test/application_manager_impl_test.cc index 2c16048e97..687959263f 100644 --- a/src/components/application_manager/test/application_manager_impl_test.cc +++ b/src/components/application_manager/test/application_manager_impl_test.cc @@ -1198,14 +1198,19 @@ TEST_F(ApplicationManagerImplTest, StartStopAudioPassThru) { const uint32_t app_id = 65537; const int32_t max_duration = 1000; - // below are not used const int32_t correlation_id = 0; const int32_t sampling_rate = 0; const int32_t bits_per_sample = 0; const int32_t audio_type = 0; - EXPECT_CALL(mock_media_manager, - StartMicrophoneRecording(app_id, _, max_duration)) + EXPECT_CALL( + mock_media_manager, + StartMicrophoneRecording(app_id, + _, + max_duration, + mobile_apis::SamplingRate::SamplingRate_8KHZ, + mobile_apis::BitsPerSample::BitsPerSample_8_BIT, + mobile_apis::AudioType::PCM)) .WillOnce(Return()); EXPECT_CALL(mock_media_manager, StopMicrophoneRecording(app_id)) .WillOnce(Return()); @@ -1282,14 +1287,19 @@ TEST_F(ApplicationManagerImplTest, UnregisterAnotherAppDuringAudioPassThru) { app_manager_impl_->AddMockApplication(mock_app_2); const int32_t max_duration = 1000; - // below are not used const int32_t correlation_id = 0; const int32_t sampling_rate = 0; const int32_t bits_per_sample = 0; const int32_t audio_type = 0; - EXPECT_CALL(mock_media_manager, - StartMicrophoneRecording(app_id_2, _, max_duration)) + EXPECT_CALL( + mock_media_manager, + StartMicrophoneRecording(app_id_2, + _, + max_duration, + mobile_apis::SamplingRate::SamplingRate_8KHZ, + mobile_apis::BitsPerSample::BitsPerSample_8_BIT, + mobile_apis::AudioType::PCM)) .WillOnce(Return()); EXPECT_CALL(mock_media_manager, StopMicrophoneRecording(app_id_2)) .WillOnce(Return()); diff --git a/src/components/include/media_manager/media_manager.h b/src/components/include/media_manager/media_manager.h index 123e11f2f0..2d2201a949 100644 --- a/src/components/include/media_manager/media_manager.h +++ b/src/components/include/media_manager/media_manager.h @@ -34,8 +34,10 @@ #define SRC_COMPONENTS_INCLUDE_MEDIA_MANAGER_MEDIA_MANAGER_H_ #include <string> +#include "interfaces/MOBILE_API.h" // see discussion in sdl_core PR #2184 #include "media_manager/media_manager_settings.h" #include "protocol/service_type.h" +#include "utils/macro.h" // for "DEPRECATED" namespace media_manager { class MediaManager { @@ -43,9 +45,17 @@ class MediaManager { virtual void PlayA2DPSource(int32_t application_key) = 0; virtual void StopA2DPSource(int32_t application_key) = 0; - virtual void StartMicrophoneRecording(int32_t application_key, - const std::string& outputFileName, - int32_t duration) = 0; + DEPRECATED virtual void StartMicrophoneRecording( + int32_t application_key, + const std::string& outputFileName, + int32_t duration) = 0; + virtual void StartMicrophoneRecording( + int32_t application_key, + const std::string& outputFileName, + int32_t duration, + mobile_apis::SamplingRate::eType sampling_rate, + mobile_apis::BitsPerSample::eType bits_per_sample, + mobile_apis::AudioType::eType audio_type) = 0; virtual void StopMicrophoneRecording(int32_t application_key) = 0; virtual void StartStreaming(int32_t application_key, diff --git a/src/components/include/test/media_manager/mock_media_manager.h b/src/components/include/test/media_manager/mock_media_manager.h index aa0baa5682..364c495236 100644 --- a/src/components/include/test/media_manager/mock_media_manager.h +++ b/src/components/include/test/media_manager/mock_media_manager.h @@ -47,6 +47,13 @@ class MockMediaManager : public media_manager::MediaManager { void(int32_t application_key, const std::string& outputFileName, int32_t duration)); + MOCK_METHOD6(StartMicrophoneRecording, + void(int32_t application_key, + const std::string& outputFileName, + int32_t duration, + mobile_apis::SamplingRate::eType, + mobile_apis::BitsPerSample::eType, + mobile_apis::AudioType::eType)); MOCK_METHOD1(StopMicrophoneRecording, void(int32_t application_key)); MOCK_METHOD2(StartStreaming, void(int32_t application_key, diff --git a/src/components/media_manager/include/media_manager/audio/audio_stream_sender_thread.h b/src/components/media_manager/include/media_manager/audio/audio_stream_sender_thread.h index cb0ea8aa11..1999da987f 100644 --- a/src/components/media_manager/include/media_manager/audio/audio_stream_sender_thread.h +++ b/src/components/media_manager/include/media_manager/audio/audio_stream_sender_thread.h @@ -46,22 +46,6 @@ class ApplicationManager; namespace media_manager { -typedef enum { - SR_INVALID = -1, - SR_8KHZ = 0, - SR_16KHZ = 1, - SR_22KHZ = 2, - SR_44KHZ = 3 -} SamplingRate; - -typedef enum { - ACQ_INVALID = -1, - ACQ_8_BIT = 0, - ACQ_16_BIT = 1 -} AudioCaptureQuality; - -typedef enum { AT_INVALID = -1, AT_PCM = 0 } AudioType; - // AudioPassThru typedef struct { std::vector<uint8_t> binary_data; diff --git a/src/components/media_manager/include/media_manager/audio/from_mic_recorder_adapter.h b/src/components/media_manager/include/media_manager/audio/from_mic_recorder_adapter.h index 7daf9c7add..9e0a8b5123 100644 --- a/src/components/media_manager/include/media_manager/audio/from_mic_recorder_adapter.h +++ b/src/components/media_manager/include/media_manager/audio/from_mic_recorder_adapter.h @@ -34,6 +34,7 @@ #define SRC_COMPONENTS_MEDIA_MANAGER_INCLUDE_MEDIA_MANAGER_AUDIO_FROM_MIC_RECORDER_ADAPTER_H_ #include <string> +#include "interfaces/MOBILE_API.h" #include "media_manager/media_adapter_impl.h" namespace threads { @@ -52,12 +53,19 @@ class FromMicRecorderAdapter : public MediaAdapterImpl { void StopActivity(int32_t application_key); bool is_app_performing_activity(int32_t application_key) const; void set_output_file(const std::string& output_file); - void set_duration(int32_t duration); + DEPRECATED void set_duration(int32_t duration); + void set_config(mobile_apis::SamplingRate::eType sampling_rate, + mobile_apis::BitsPerSample::eType bits_per_sample, + mobile_apis::AudioType::eType audio_type, + int32_t duration); private: threads::Thread* recorder_thread_; std::string output_file_; const int32_t kDefaultDuration; + mobile_apis::SamplingRate::eType sampling_rate_; + mobile_apis::BitsPerSample::eType bits_per_sample_; + mobile_apis::AudioType::eType audio_type_; int32_t duration_; DISALLOW_COPY_AND_ASSIGN(FromMicRecorderAdapter); }; diff --git a/src/components/media_manager/include/media_manager/audio/from_mic_to_file_recorder_thread.h b/src/components/media_manager/include/media_manager/audio/from_mic_to_file_recorder_thread.h index e6b54cc487..89c298f280 100644 --- a/src/components/media_manager/include/media_manager/audio/from_mic_to_file_recorder_thread.h +++ b/src/components/media_manager/include/media_manager/audio/from_mic_to_file_recorder_thread.h @@ -37,6 +37,7 @@ #include <net/if.h> #include <string> +#include "interfaces/MOBILE_API.h" #include "utils/lock.h" #include "utils/threads/thread.h" #include "utils/threads/thread_delegate.h" @@ -45,7 +46,15 @@ namespace media_manager { class FromMicToFileRecorderThread : public threads::ThreadDelegate { public: - FromMicToFileRecorderThread(const std::string& output_file, int32_t duration); + FromMicToFileRecorderThread( + const std::string& output_file, + int32_t duration, + mobile_apis::SamplingRate::eType sampling_rate = + mobile_apis::SamplingRate::INVALID_ENUM, + mobile_apis::BitsPerSample::eType bits_per_sample = + mobile_apis::BitsPerSample::INVALID_ENUM, + mobile_apis::AudioType::eType audio_type = + mobile_apis::AudioType::INVALID_ENUM); ~FromMicToFileRecorderThread(); void threadMain(); @@ -67,6 +76,8 @@ class FromMicToFileRecorderThread : public threads::ThreadDelegate { sync_primitives::Lock stopFlagLock_; std::string outputFileName_, durationString_; + mobile_apis::SamplingRate::eType samplingRate_; + mobile_apis::BitsPerSample::eType bitsPerSample_; typedef struct { GstElement* pipeline; @@ -77,6 +88,10 @@ class FromMicToFileRecorderThread : public threads::ThreadDelegate { void deinitArgs(); void psleep(void* timeout); + // create_caps_string() creates a string which is fed to capsfilter's "caps" + // property. The string specifies audio format. example: + // "audio/x-raw,format=(string)S16LE,rate=44100,channels=1" + std::string create_caps_string(); class SleepThreadDelegate : public threads::ThreadDelegate { public: diff --git a/src/components/media_manager/include/media_manager/media_manager_impl.h b/src/components/media_manager/include/media_manager/media_manager_impl.h index 408fa12655..3e24212ed5 100644 --- a/src/components/media_manager/include/media_manager/media_manager_impl.h +++ b/src/components/media_manager/include/media_manager/media_manager_impl.h @@ -36,6 +36,7 @@ #include <chrono> #include <map> #include <string> +#include "interfaces/MOBILE_API.h" #include "media_manager/media_adapter_impl.h" #include "media_manager/media_adapter_listener.h" #include "media_manager/media_manager.h" @@ -62,9 +63,17 @@ class MediaManagerImpl : public MediaManager, virtual void PlayA2DPSource(int32_t application_key); virtual void StopA2DPSource(int32_t application_key); - virtual void StartMicrophoneRecording(int32_t application_key, - const std::string& outputFileName, - int32_t duration); + DEPRECATED virtual void StartMicrophoneRecording( + int32_t application_key, + const std::string& outputFileName, + int32_t duration); + virtual void StartMicrophoneRecording( + int32_t application_key, + const std::string& outputFileName, + int32_t duration, + mobile_apis::SamplingRate::eType sampling_rate, + mobile_apis::BitsPerSample::eType bits_per_sample, + mobile_apis::AudioType::eType audio_type); virtual void StopMicrophoneRecording(int32_t application_key); virtual void StartStreaming(int32_t application_key, diff --git a/src/components/media_manager/src/audio/from_mic_recorder_adapter.cc b/src/components/media_manager/src/audio/from_mic_recorder_adapter.cc index e55efed4ce..2575643422 100644 --- a/src/components/media_manager/src/audio/from_mic_recorder_adapter.cc +++ b/src/components/media_manager/src/audio/from_mic_recorder_adapter.cc @@ -32,6 +32,7 @@ #include "media_manager/audio/from_mic_recorder_adapter.h" #include <string> +#include "interfaces/MOBILE_API.h" #include "media_manager/audio/from_mic_to_file_recorder_thread.h" #include "utils/logger.h" #include "utils/threads/thread.h" @@ -44,6 +45,9 @@ FromMicRecorderAdapter::FromMicRecorderAdapter() : recorder_thread_(NULL) , output_file_("default_recorded_audio.wav") , kDefaultDuration(1000) + , sampling_rate_(mobile_apis::SamplingRate::INVALID_ENUM) + , bits_per_sample_(mobile_apis::BitsPerSample::INVALID_ENUM) + , audio_type_(mobile_apis::AudioType::INVALID_ENUM) , duration_(kDefaultDuration) {} FromMicRecorderAdapter::~FromMicRecorderAdapter() { @@ -66,7 +70,11 @@ void FromMicRecorderAdapter::StartActivity(int32_t application_key) { // Todd: No gstreamer recorder thread if (!recorder_thread_) { FromMicToFileRecorderThread* thread_delegate = - new FromMicToFileRecorderThread(output_file_, duration_); + new FromMicToFileRecorderThread(output_file_, + duration_, + sampling_rate_, + bits_per_sample_, + audio_type_); recorder_thread_ = threads::CreateThread("MicrophoneRec", thread_delegate); } @@ -107,4 +115,15 @@ void FromMicRecorderAdapter::set_duration(int32_t duration) { duration_ = duration; } +void FromMicRecorderAdapter::set_config( + mobile_apis::SamplingRate::eType sampling_rate, + mobile_apis::BitsPerSample::eType bits_per_sample, + mobile_apis::AudioType::eType audio_type, + int32_t duration) { + sampling_rate_ = sampling_rate; + bits_per_sample_ = bits_per_sample; + audio_type_ = audio_type; + duration_ = duration; +} + } // namespace media_manager diff --git a/src/components/media_manager/src/audio/from_mic_to_file_recorder_thread.cc b/src/components/media_manager/src/audio/from_mic_to_file_recorder_thread.cc index a34bdd3f09..877722fd70 100644 --- a/src/components/media_manager/src/audio/from_mic_to_file_recorder_thread.cc +++ b/src/components/media_manager/src/audio/from_mic_to_file_recorder_thread.cc @@ -34,6 +34,7 @@ #include <unistd.h> #include <cstring> #include <sstream> +#include "interfaces/MOBILE_API.h" #include "utils/logger.h" namespace media_manager { @@ -46,16 +47,23 @@ GMainLoop* FromMicToFileRecorderThread::loop = NULL; static const int kNumAudioChannels = 1; FromMicToFileRecorderThread::FromMicToFileRecorderThread( - const std::string& output_file, int32_t duration) + const std::string& output_file, + int32_t duration, + mobile_apis::SamplingRate::eType sampling_rate, + mobile_apis::BitsPerSample::eType bits_per_sample, + mobile_apis::AudioType::eType audio_type) : threads::ThreadDelegate() , argc_(5) , argv_(NULL) , oKey_("-o") , tKey_("-t") , sleepThread_(NULL) - , outputFileName_(output_file) { + , outputFileName_(output_file) + , samplingRate_(sampling_rate) + , bitsPerSample_(bits_per_sample) { LOG4CXX_AUTO_TRACE(logger_); set_record_duration(duration); + // audio_type is not used as we always employ LPCM } FromMicToFileRecorderThread::~FromMicToFileRecorderThread() { @@ -205,9 +213,11 @@ void FromMicToFileRecorderThread::threadMain() { wavenc = gst_element_factory_make("wavenc", "wavenc0"); filesink = gst_element_factory_make("filesink", "filesink0"); - // create a capability to downmix the recorded audio to monaural - audiocaps = gst_caps_new_simple( - "audio/x-raw", "channels", G_TYPE_INT, kNumAudioChannels, NULL); + // Create a capability to specify audio format. It also downmixes the recorded + // audio to monaural. + std::string caps_string = create_caps_string(); + LOG4CXX_DEBUG(logger_, "Using audio caps: " << caps_string); + audiocaps = gst_caps_from_string(caps_string.c_str()); // Assert that all the elements were created if (!alsasrc || !audioconvert || !capsfilter || !wavenc || !filesink || @@ -285,6 +295,49 @@ void FromMicToFileRecorderThread::threadMain() { loop = NULL; } +std::string FromMicToFileRecorderThread::create_caps_string() { + LOG4CXX_AUTO_TRACE(logger_); + + std::stringstream ss; + ss << "audio/x-raw"; + + switch (bitsPerSample_) { + case mobile_apis::BitsPerSample::BitsPerSample_8_BIT: + // format is 8-bit unsigned + ss << ",format=(string)U8"; + break; + case mobile_apis::BitsPerSample::BitsPerSample_16_BIT: + // format is 16-bit signed, in little endian + ss << ",format=(string)S16LE"; + break; + default: + // do not specify the format; use system default + break; + } + + switch (samplingRate_) { + case mobile_apis::SamplingRate::SamplingRate_8KHZ: + ss << ",rate=8000"; + break; + case mobile_apis::SamplingRate::SamplingRate_16KHZ: + ss << ",rate=16000"; + break; + case mobile_apis::SamplingRate::SamplingRate_22KHZ: + ss << ",rate=22050"; + break; + case mobile_apis::SamplingRate::SamplingRate_44KHZ: + ss << ",rate=44100"; + break; + default: + // do not specify the sampling rate; use system default + break; + } + + ss << ",channels=" << kNumAudioChannels; + + return ss.str(); +} + FromMicToFileRecorderThread::SleepThreadDelegate::SleepThreadDelegate( GstTimeout timeout) : threads::ThreadDelegate(), timeout_(timeout) {} diff --git a/src/components/media_manager/src/media_manager_impl.cc b/src/components/media_manager/src/media_manager_impl.cc index b04381605d..d7352d0025 100644 --- a/src/components/media_manager/src/media_manager_impl.cc +++ b/src/components/media_manager/src/media_manager_impl.cc @@ -36,6 +36,7 @@ #include "application_manager/application_manager.h" #include "application_manager/message_helper.h" #include "application_manager/smart_object_keys.h" +#include "interfaces/MOBILE_API.h" #include "media_manager/audio/from_mic_recorder_listener.h" #include "media_manager/streamer_listener.h" #include "protocol_handler/protocol_handler.h" @@ -208,6 +209,21 @@ void MediaManagerImpl::StopA2DPSource(int32_t application_key) { void MediaManagerImpl::StartMicrophoneRecording(int32_t application_key, const std::string& output_file, int32_t duration) { + StartMicrophoneRecording(application_key, + output_file, + duration, + mobile_apis::SamplingRate::INVALID_ENUM, + mobile_apis::BitsPerSample::INVALID_ENUM, + mobile_apis::AudioType::INVALID_ENUM); +} + +void MediaManagerImpl::StartMicrophoneRecording( + int32_t application_key, + const std::string& output_file, + int32_t duration, + mobile_apis::SamplingRate::eType sampling_rate, + mobile_apis::BitsPerSample::eType bits_per_sample, + mobile_apis::AudioType::eType audio_type) { LOG4CXX_INFO(logger_, "MediaManagerImpl::StartMicrophoneRecording to " << output_file); application_manager::ApplicationSharedPtr app = @@ -223,7 +239,7 @@ void MediaManagerImpl::StartMicrophoneRecording(int32_t application_key, (static_cast<FromMicRecorderAdapter*>(from_mic_recorder_)) ->set_output_file(file_path); (static_cast<FromMicRecorderAdapter*>(from_mic_recorder_)) - ->set_duration(duration); + ->set_config(sampling_rate, bits_per_sample, audio_type, duration); from_mic_recorder_->StartActivity(application_key); } #else diff --git a/src/components/media_manager/test/media_manager_impl_test.cc b/src/components/media_manager/test/media_manager_impl_test.cc index 627e2f57ed..3b4e6f6150 100644 --- a/src/components/media_manager/test/media_manager_impl_test.cc +++ b/src/components/media_manager/test/media_manager_impl_test.cc @@ -331,7 +331,12 @@ TEST_F(MediaManagerImplTest, EXPECT_EQ(data[i], result[i]); } media_manager_impl_->StartMicrophoneRecording( - kApplicationKey, kOutputFile, kDuration); + kApplicationKey, + kOutputFile, + kDuration, + mobile_apis::SamplingRate::SamplingRate_8KHZ, + mobile_apis::BitsPerSample::BitsPerSample_8_BIT, + mobile_apis::AudioType::PCM); EXPECT_TRUE(RemoveDirectory(kResourceFolder, true)); EXPECT_TRUE(RemoveDirectory(kStorageFolder, true)); } @@ -342,7 +347,12 @@ TEST_F(MediaManagerImplTest, media_manager_impl_->set_mock_mic_listener(media_adapter_listener_mock_); EXPECT_FALSE(FileExists(kOutputFilePath)); media_manager_impl_->StartMicrophoneRecording( - kApplicationKey, kOutputFile, kDuration); + kApplicationKey, + kOutputFile, + kDuration, + mobile_apis::SamplingRate::SamplingRate_8KHZ, + mobile_apis::BitsPerSample::BitsPerSample_8_BIT, + mobile_apis::AudioType::PCM); } TEST_F(MediaManagerImplTest, @@ -358,7 +368,12 @@ TEST_F(MediaManagerImplTest, media_manager_impl_->set_mock_mic_listener(media_adapter_listener_mock_); EXPECT_TRUE(FileExists(kOutputFilePath)); media_manager_impl_->StartMicrophoneRecording( - kApplicationKey, kOutputFile, kDuration); + kApplicationKey, + kOutputFile, + kDuration, + mobile_apis::SamplingRate::SamplingRate_8KHZ, + mobile_apis::BitsPerSample::BitsPerSample_8_BIT, + mobile_apis::AudioType::PCM); chmod(kOutputFilePath.c_str(), S_IWUSR); EXPECT_TRUE(RemoveDirectory(kStorageFolder, true)); } |