1 /* 2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef AUDIO_CAPTURER_PRIVATE_H 17 #define AUDIO_CAPTURER_PRIVATE_H 18 19 #include <mutex> 20 #include "audio_interrupt_callback.h" 21 #include "i_audio_stream.h" 22 #include "audio_capturer_proxy_obj.h" 23 24 namespace OHOS { 25 namespace AudioStandard { 26 constexpr uint32_t INVALID_SESSION_ID = static_cast<uint32_t>(-1); 27 28 class AudioCapturerPrivate : public AudioCapturer { 29 public: 30 int32_t GetFrameCount(uint32_t &frameCount) const override; 31 int32_t SetParams(const AudioCapturerParams params) override; 32 int32_t SetCapturerCallback(const std::shared_ptr<AudioCapturerCallback> &callback) override; 33 int32_t GetParams(AudioCapturerParams ¶ms) const override; 34 int32_t GetCapturerInfo(AudioCapturerInfo &capturerInfo) const override; 35 int32_t GetStreamInfo(AudioStreamInfo &streamInfo) const override; 36 bool Start() const override; 37 int32_t Read(uint8_t &buffer, size_t userSize, bool isBlockingRead) const override; 38 CapturerState GetStatus() const override; 39 bool GetAudioTime(Timestamp ×tamp, Timestamp::Timestampbase base) const override; 40 bool Pause() const override; 41 bool Stop() const override; 42 bool Flush() const override; 43 bool Release() override; 44 int32_t GetBufferSize(size_t &bufferSize) const override; 45 int32_t GetAudioStreamId(uint32_t &sessionID) const override; 46 int32_t SetCapturerPositionCallback(int64_t markPosition, 47 const std::shared_ptr<CapturerPositionCallback> &callback) override; 48 void UnsetCapturerPositionCallback() override; 49 int32_t SetCapturerPeriodPositionCallback(int64_t frameNumber, 50 const std::shared_ptr<CapturerPeriodPositionCallback> &callback) override; 51 void UnsetCapturerPeriodPositionCallback() override; 52 int32_t SetBufferDuration(uint64_t bufferDuration) const override; 53 int32_t SetCaptureMode(AudioCaptureMode renderMode)const override; 54 AudioCaptureMode GetCaptureMode()const override; 55 int32_t SetCapturerReadCallback(const std::shared_ptr<AudioCapturerReadCallback> &callback) override; 56 int32_t GetBufferDesc(BufferDesc &bufDesc)const override; 57 int32_t Enqueue(const BufferDesc &bufDesc)const override; 58 int32_t Clear()const override; 59 int32_t GetBufQueueState(BufferQueueState &bufState)const override; 60 void SetApplicationCachePath(const std::string cachePath) override; 61 void SetValid(bool valid) override; 62 int64_t GetFramesRead() const override; 63 64 std::shared_ptr<IAudioStream> audioStream_; 65 AudioCapturerInfo capturerInfo_ = {}; 66 AudioStreamType audioStreamType_; 67 std::string cachePath_; 68 69 AudioCapturerPrivate(AudioStreamType audioStreamType, const AppInfo &appInfo, bool createStream = true); 70 virtual ~AudioCapturerPrivate(); 71 bool isChannelChange_ = false; 72 int32_t InitPlaybackCapturer(int32_t type, const AudioPlaybackCaptureConfig &config); 73 ConvertToAudioStreamParams(const AudioCapturerParams params)74 static inline AudioStreamParams ConvertToAudioStreamParams(const AudioCapturerParams params) 75 { 76 AudioStreamParams audioStreamParams; 77 78 audioStreamParams.format = params.audioSampleFormat; 79 audioStreamParams.samplingRate = params.samplingRate; 80 audioStreamParams.channels = params.audioChannel; 81 audioStreamParams.encoding = params.audioEncoding; 82 83 return audioStreamParams; 84 } 85 86 private: 87 std::shared_ptr<AudioStreamCallback> audioStreamCallback_ = nullptr; 88 std::shared_ptr<AudioInterruptCallback> audioInterruptCallback_ = nullptr; 89 AppInfo appInfo_ = {}; 90 AudioInterrupt audioInterrupt_ = {STREAM_USAGE_UNKNOWN, CONTENT_TYPE_UNKNOWN, 91 {AudioStreamType::STREAM_DEFAULT, SourceType::SOURCE_TYPE_INVALID, false}, 0}; 92 bool isVoiceCallCapturer_ = false; 93 uint32_t sessionID_ = INVALID_SESSION_ID; 94 std::shared_ptr<AudioCapturerProxyObj> capturerProxyObj_; 95 std::map<AudioStreamType, SourceType> streamToSource_ = { 96 {AudioStreamType::STREAM_MUSIC, SourceType::SOURCE_TYPE_MIC}, 97 {AudioStreamType::STREAM_MEDIA, SourceType::SOURCE_TYPE_MIC}, 98 {AudioStreamType::STREAM_VOICE_CALL, SourceType::SOURCE_TYPE_VOICE_COMMUNICATION}, 99 {AudioStreamType::STREAM_ULTRASONIC, SourceType::SOURCE_TYPE_ULTRASONIC}, 100 {AudioStreamType::STREAM_WAKEUP, SourceType::SOURCE_TYPE_WAKEUP} 101 }; 102 std::mutex lock_; 103 bool isValid_ = true; 104 }; 105 106 class AudioCapturerInterruptCallbackImpl : public AudioInterruptCallback { 107 public: 108 explicit AudioCapturerInterruptCallbackImpl(const std::shared_ptr<IAudioStream> &audioStream); 109 virtual ~AudioCapturerInterruptCallbackImpl(); 110 111 void OnInterrupt(const InterruptEventInternal &interruptEvent) override; 112 void SaveCallback(const std::weak_ptr<AudioCapturerCallback> &callback); 113 private: 114 void NotifyEvent(const InterruptEvent &interruptEvent); 115 void HandleAndNotifyForcedEvent(const InterruptEventInternal &interruptEvent); 116 void NotifyForcePausedToResume(const InterruptEventInternal &interruptEvent); 117 std::shared_ptr<IAudioStream> audioStream_; 118 std::weak_ptr<AudioCapturerCallback> callback_; 119 bool isForcePaused_ = false; 120 std::shared_ptr<AudioCapturerCallback> cb_; 121 }; 122 123 class AudioStreamCallbackCapturer : public AudioStreamCallback { 124 public: 125 virtual ~AudioStreamCallbackCapturer() = default; 126 127 void OnStateChange(const State state, const StateChangeCmdType __attribute__((unused)) cmdType) override; 128 void SaveCallback(const std::weak_ptr<AudioCapturerCallback> &callback); 129 private: 130 std::weak_ptr<AudioCapturerCallback> callback_; 131 }; 132 } // namespace AudioStandard 133 } // namespace OHOS 134 135 #endif // AUDIO_CAPTURER_PRIVATE_H 136