1 /* 2 * Copyright (c) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License") = 0; 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 #ifndef I_AUDIO_STREAM_H 16 #define I_AUDIO_STREAM_H 17 18 #include <map> 19 #include <memory> 20 #include "timestamp.h" 21 #include "audio_info.h" 22 #include "audio_capturer.h" 23 #include "audio_renderer.h" 24 #include "audio_stream_manager.h" 25 26 namespace OHOS { 27 namespace AudioStandard { 28 class AudioStreamCallback { 29 public: 30 virtual ~AudioStreamCallback() = default; 31 /** 32 * Called when stream state is updated. 33 * 34 * @param state Indicates the InterruptEvent information needed by client. 35 * For details, refer InterruptEvent struct in audio_info.h 36 */ 37 virtual void OnStateChange(const State state, const StateChangeCmdType cmdType = CMD_FROM_CLIENT) = 0; 38 }; 39 class IAudioStream { 40 public: 41 enum StreamClass : uint32_t { 42 PA_STREAM = 0, 43 FAST_STREAM, 44 }; 45 46 struct SwitchInfo { 47 AudioStreamParams params; 48 AudioStreamType eStreamType; 49 int32_t appUid; 50 AudioRendererInfo rendererInfo; 51 AudioCapturerInfo capturerInfo; 52 State state; 53 uint32_t sessionId; 54 std::string cachePath = ""; 55 uint32_t rendererSampleRate; 56 uint32_t underFlowCount; 57 AudioEffectMode effectMode; 58 AudioRenderMode renderMode; 59 AudioCaptureMode captureMode; 60 AudioRendererRate renderRate; 61 int32_t clientPid = 0; 62 int32_t clientUid = 0; 63 std::shared_ptr<AudioClientTracker> proxyObj; 64 AudioPrivacyType privacyType; 65 float volume; 66 67 bool streamTrackerRegistered = false; 68 69 uint64_t frameMarkPosition = 0; 70 uint64_t framePeriodNumber = 0; 71 72 uint64_t totalBytesWritten = 0; 73 uint64_t framePeriodWritten = 0; 74 std::shared_ptr<RendererPositionCallback> renderPositionCb; 75 std::shared_ptr<RendererPeriodPositionCallback> renderPeriodPositionCb; 76 77 uint64_t totalBytesRead = 0; 78 uint64_t framePeriodRead = 0; 79 std::shared_ptr<CapturerPositionCallback> capturePositionCb; 80 std::shared_ptr<CapturerPeriodPositionCallback> capturePeriodPositionCb; 81 82 // callback info 83 std::shared_ptr<AudioStreamCallback> audioStreamCallback; 84 std::shared_ptr<AudioRendererWriteCallback> rendererWriteCallback; 85 }; 86 87 virtual ~IAudioStream() = default; 88 89 static bool IsStreamSupported(int32_t streamFlags, const AudioStreamParams ¶ms); 90 static std::shared_ptr<IAudioStream> GetPlaybackStream(StreamClass streamClass, AudioStreamParams params, 91 AudioStreamType eStreamType, int32_t appUid); 92 static std::shared_ptr<IAudioStream> GetRecordStream(StreamClass streamClass, AudioStreamParams params, 93 AudioStreamType eStreamType, int32_t appUid); 94 95 static AudioStreamType GetStreamType(ContentType contentType, StreamUsage streamUsage); 96 static std::map<std::pair<ContentType, StreamUsage>, AudioStreamType> CreateStreamMap(); 97 static const std::string GetEffectSceneName(AudioStreamType audioType); 98 99 virtual void SetClientID(int32_t clientPid, int32_t clientUid) = 0; 100 virtual void SetRendererInfo(const AudioRendererInfo &rendererInfo) = 0; 101 virtual void SetCapturerInfo(const AudioCapturerInfo &capturerInfo) = 0; 102 virtual int32_t SetAudioStreamInfo(const AudioStreamParams info, 103 const std::shared_ptr<AudioClientTracker> &proxyObj) = 0; 104 virtual int32_t GetAudioStreamInfo(AudioStreamParams &info) = 0; 105 virtual bool CheckRecordingCreate(uint32_t appTokenId, uint64_t appFullTokenId, int32_t appUid) = 0; 106 virtual bool CheckRecordingStateChange(uint32_t appTokenId, uint64_t appFullTokenId, int32_t appUid, 107 AudioPermissionState state) = 0; 108 virtual int32_t GetAudioSessionID(uint32_t &sessionID) = 0; 109 virtual State GetState() = 0; 110 virtual bool GetAudioTime(Timestamp ×tamp, Timestamp::Timestampbase base) = 0; 111 virtual int32_t GetBufferSize(size_t &bufferSize) = 0; 112 virtual int32_t GetFrameCount(uint32_t &frameCount) = 0; 113 virtual int32_t GetLatency(uint64_t &latency) = 0; 114 virtual int32_t SetAudioStreamType(AudioStreamType audioStreamType) = 0; 115 virtual int32_t SetVolume(float volume) = 0; 116 virtual float GetVolume() = 0; 117 virtual int32_t SetRenderRate(AudioRendererRate renderRate) = 0; 118 virtual AudioRendererRate GetRenderRate() = 0; 119 virtual int32_t SetStreamCallback(const std::shared_ptr<AudioStreamCallback> &callback) = 0; 120 121 // callback mode api 122 virtual int32_t SetRenderMode(AudioRenderMode renderMode) = 0; 123 virtual AudioRenderMode GetRenderMode() = 0; 124 virtual int32_t SetRendererWriteCallback(const std::shared_ptr<AudioRendererWriteCallback> &callback) = 0; 125 126 virtual int32_t SetCaptureMode(AudioCaptureMode captureMode) = 0; 127 virtual AudioCaptureMode GetCaptureMode() = 0; 128 virtual int32_t SetCapturerReadCallback(const std::shared_ptr<AudioCapturerReadCallback> &callback) = 0; 129 130 virtual int32_t GetBufferDesc(BufferDesc &bufDesc) = 0; 131 virtual int32_t GetBufQueueState(BufferQueueState &bufState) = 0; 132 virtual int32_t Enqueue(const BufferDesc &bufDesc) = 0; 133 virtual int32_t Clear() = 0; 134 135 virtual int32_t SetLowPowerVolume(float volume) = 0; 136 virtual float GetLowPowerVolume() = 0; 137 virtual float GetSingleStreamVolume() = 0; 138 139 // for effect 140 virtual AudioEffectMode GetAudioEffectMode() = 0; 141 virtual int32_t SetAudioEffectMode(AudioEffectMode effectMode) = 0; 142 143 virtual int64_t GetFramesWritten() = 0; 144 virtual int64_t GetFramesRead() = 0; 145 146 // Common APIs 147 virtual bool StartAudioStream(StateChangeCmdType cmdType = CMD_FROM_CLIENT) = 0; 148 virtual bool PauseAudioStream(StateChangeCmdType cmdType = CMD_FROM_CLIENT) = 0; 149 virtual bool StopAudioStream() = 0; 150 virtual bool ReleaseAudioStream(bool releaseRunner = true) = 0; 151 virtual bool FlushAudioStream() = 0; 152 153 // Playback related APIs 154 virtual bool DrainAudioStream() = 0; 155 virtual size_t Write(uint8_t *buffer, size_t buffer_size) = 0; 156 157 // Recording related APIs 158 virtual int32_t Read(uint8_t &buffer, size_t userSize, bool isBlockingRead) = 0; 159 160 // for inner capturer 161 virtual void SetInnerCapturerState(bool isInnerCapturer) = 0; 162 virtual void SetPrivacyType(AudioPrivacyType privacyType) = 0; 163 164 virtual uint32_t GetUnderflowCount() = 0; 165 166 virtual void SetRendererPositionCallback(int64_t markPosition, 167 const std::shared_ptr<RendererPositionCallback> &callback) = 0; 168 virtual void UnsetRendererPositionCallback() = 0; 169 170 virtual void SetRendererPeriodPositionCallback(int64_t markPosition, 171 const std::shared_ptr<RendererPeriodPositionCallback> &callback) = 0; 172 virtual void UnsetRendererPeriodPositionCallback() = 0; 173 174 virtual void SetCapturerPositionCallback(int64_t markPosition, 175 const std::shared_ptr<CapturerPositionCallback> &callback) = 0; 176 virtual void UnsetCapturerPositionCallback() = 0; 177 178 virtual void SetCapturerPeriodPositionCallback(int64_t markPosition, 179 const std::shared_ptr<CapturerPeriodPositionCallback> &callback) = 0; 180 181 virtual void UnsetCapturerPeriodPositionCallback() = 0; 182 virtual int32_t SetRendererSamplingRate(uint32_t sampleRate) = 0; 183 virtual uint32_t GetRendererSamplingRate() = 0; 184 virtual int32_t SetBufferSizeInMsec(int32_t bufferSizeInMsec) = 0; 185 virtual void SetApplicationCachePath(const std::string cachePath) = 0; 186 187 virtual IAudioStream::StreamClass GetStreamClass() = 0; 188 virtual void SetStreamTrackerState(bool trackerRegisteredState) = 0; 189 virtual void GetSwitchInfo(SwitchInfo& info) = 0; 190 191 //for wakeup capturer 192 virtual void SetWakeupCapturerState(bool isWakeupCapturer) = 0; 193 }; 194 } // namespace AudioStandard 195 } // namespace OHOS 196 #endif // I_AUDIO_STREAM_H 197