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 #ifndef AUDIO_CAPTURER_SERVER_H 16 #define AUDIO_CAPTURER_SERVER_H 17 18 #include <mutex> 19 #include <pthread.h> 20 #include <thread> 21 #include "audio_capturer_impl.h" 22 #include "ipc_skeleton.h" 23 #include "serializer.h" 24 #include "surface.h" 25 26 using OHOS::Audio::AudioCapturerImpl; 27 using OHOS::Surface; 28 namespace OHOS { 29 namespace Audio { 30 enum AudioCapturerFuncId { 31 AUD_CAP_FUNC_CONNECT, 32 AUD_CAP_FUNC_DISCONNECT, 33 AUD_CAP_FUNC_GET_FRAME_COUNT, 34 AUD_CAP_FUNC_GET_STATUS, 35 AUD_CAP_FUNC_GET_TIME, 36 AUD_CAP_FUNC_SET_INFO, 37 AUD_CAP_FUNC_GET_INFO, 38 AUD_CAP_FUNC_START, 39 AUD_CAP_FUNC_STOP, 40 AUD_CAP_FUNC_RELEASE, 41 AUD_CAP_FUNC_GET_MIN_FRAME_COUNT, 42 AUD_CAP_FUNC_SET_SURFACE, 43 AUD_CAP_FUNC_BUTT, 44 }; 45 46 static constexpr int32_t DEFAULT_IPC_SIZE = 100; 47 #define AUDIO_CAPTURER_SERVICE_NAME "AudioCapServer" 48 49 /* Since IPC is serialized, there is no concurrency problem */ 50 class AudioCapturerServer { 51 public: 52 AudioCapturerServer() = default; 53 ~AudioCapturerServer() = default; 54 55 int32_t AudioCapturerServerInit(); 56 static AudioCapturerServer *GetInstance(); 57 AudioCapturerImpl *GetAudioCapturer(pid_t pid); 58 void AcceptServer(pid_t pid, IpcIo *reply); 59 void DropServer(pid_t pid, IpcIo *reply); 60 void Dispatch(int32_t funcId, pid_t pid, IpcIo *req, IpcIo *reply); 61 static void *ReadAudioDataProcess(void *serverStr); 62 63 private: 64 void GetMinFrameCount(IpcIo *req, IpcIo *reply); 65 int32_t SetSurfaceProcess(Surface *surface); 66 void SetInfo(AudioCapturerImpl *capturer, IpcIo *req, IpcIo *reply); 67 void GetInfo(AudioCapturerImpl *capturer, IpcIo *reply); 68 void Start(AudioCapturerImpl *capturer, IpcIo *reply); 69 void Stop(AudioCapturerImpl *capturer, IpcIo *reply); 70 void GetMiniFrameCount(IpcIo *req, IpcIo *reply); 71 void GetFrameCount(AudioCapturerImpl *capturer, IpcIo *reply); 72 void GetStatus(AudioCapturerImpl *capturer, IpcIo *reply); 73 void SetSurface(IpcIo *req, IpcIo *reply); 74 SurfaceBuffer *GetCacheBuffer(void); 75 void CancelBuffer(SurfaceBuffer *buffer); 76 void FreeCacheBuffer(void); 77 78 pid_t clientPid_ = -1; 79 AudioCapturerImpl *capturer_ = nullptr; 80 Surface *surface_ = nullptr; 81 // std::thread dataThreadId_; 82 pthread_t dataThreadId_ = 0; 83 std::mutex lock_; 84 bool threadExit_ = false; 85 SurfaceBuffer *bufCache_ = nullptr; 86 }; 87 88 void AudioCapturerServiceReg(); 89 } // namespace Audio 90 } // namespace OHOS 91 #endif // AUDIO_CAPTURER_SERVER_H 92