1 /*
2  * Copyright (c) 2021-2023 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 LOG_TAG
16 #define LOG_TAG "AudioCapturerFileSource"
17 #endif
18 
19 #include "audio_capturer_file_source.h"
20 
21 #include <cerrno>
22 #include <climits>
23 #include <cstdlib>
24 #include <string>
25 
26 #include "audio_errors.h"
27 #include "audio_hdi_log.h"
28 
29 using namespace std;
30 
31 namespace OHOS {
32 namespace AudioStandard {
AudioCapturerFileSource()33 AudioCapturerFileSource::AudioCapturerFileSource()
34 {
35 }
36 
~AudioCapturerFileSource()37 AudioCapturerFileSource::~AudioCapturerFileSource()
38 {
39     AudioCapturerFileSource::DeInit();
40 }
41 
SetVolume(float left,float right)42 int32_t AudioCapturerFileSource::SetVolume(float left, float right)
43 {
44     return SUCCESS;
45 }
46 
GetVolume(float & left,float & right)47 int32_t AudioCapturerFileSource::GetVolume(float &left, float &right)
48 {
49     return SUCCESS;
50 }
51 
SetMute(bool isMute)52 int32_t AudioCapturerFileSource::SetMute(bool isMute)
53 {
54     return SUCCESS;
55 }
56 
GetMute(bool & isMute)57 int32_t AudioCapturerFileSource::GetMute(bool &isMute)
58 {
59     return SUCCESS;
60 }
61 
SetInputRoute(DeviceType inputDevice)62 int32_t AudioCapturerFileSource::SetInputRoute(DeviceType inputDevice)
63 {
64     return SUCCESS;
65 }
66 
RegisterWakeupCloseCallback(IAudioSourceCallback * callback)67 void AudioCapturerFileSource::RegisterWakeupCloseCallback(IAudioSourceCallback *callback)
68 {
69     AUDIO_WARNING_LOG("RegisterWakeupCloseCallback FAILED");
70 }
71 
RegisterAudioCapturerSourceCallback(std::unique_ptr<ICapturerStateCallback> callback)72 void AudioCapturerFileSource::RegisterAudioCapturerSourceCallback(std::unique_ptr<ICapturerStateCallback> callback)
73 {
74     AUDIO_WARNING_LOG("RegisterAudioCapturerSourceCallback FAILED");
75 }
76 
RegisterParameterCallback(IAudioSourceCallback * callback)77 void AudioCapturerFileSource::RegisterParameterCallback(IAudioSourceCallback *callback)
78 {
79     AUDIO_WARNING_LOG("RegisterParameterCallback in file mode is not supported!");
80 }
81 
SetAudioScene(AudioScene audioScene,DeviceType activeDevice)82 int32_t AudioCapturerFileSource::SetAudioScene(AudioScene audioScene, DeviceType activeDevice)
83 {
84     return SUCCESS;
85 }
86 
GetTransactionId(void)87 uint64_t AudioCapturerFileSource::GetTransactionId(void)
88 {
89     uint64_t res = -1L;
90     return res;
91 }
92 
GetPresentationPosition(uint64_t & frames,int64_t & timeSec,int64_t & timeNanoSec)93 int32_t AudioCapturerFileSource::GetPresentationPosition(uint64_t& frames, int64_t& timeSec, int64_t& timeNanoSec)
94 {
95     return SUCCESS;
96 }
97 
Pause(void)98 int32_t AudioCapturerFileSource::Pause(void)
99 {
100     return SUCCESS;
101 }
102 
Resume(void)103 int32_t AudioCapturerFileSource::Resume(void)
104 {
105     return SUCCESS;
106 }
107 
Reset(void)108 int32_t AudioCapturerFileSource::Reset(void)
109 {
110     return SUCCESS;
111 }
112 
Flush(void)113 int32_t AudioCapturerFileSource::Flush(void)
114 {
115     return SUCCESS;
116 }
117 
IsInited(void)118 bool AudioCapturerFileSource::IsInited(void)
119 {
120     return capturerInited_;
121 }
122 
DeInit()123 void AudioCapturerFileSource::DeInit()
124 {
125     if (filePtr != nullptr) {
126         fclose(filePtr);
127         filePtr = nullptr;
128     }
129     capturerInited_ = false;
130 }
131 
Init(const IAudioSourceAttr & attr)132 int32_t AudioCapturerFileSource::Init(const IAudioSourceAttr &attr)
133 {
134     const char *filePath = attr.filePath;
135     char realPath[PATH_MAX + 1] = {0x00};
136     std::string sourceFilePath(filePath);
137     std::string rootPath;
138     std::string fileName;
139 
140     auto pos = sourceFilePath.rfind("/");
141     if (pos!= std::string::npos) {
142         rootPath = sourceFilePath.substr(0, pos);
143         fileName = sourceFilePath.substr(pos);
144     }
145 
146     bool tmp = strlen(sourceFilePath.c_str()) >= PATH_MAX || realpath(rootPath.c_str(), realPath) == nullptr;
147     CHECK_AND_RETURN_RET_LOG(!tmp, ERROR, "AudioCapturerFileSource:: Invalid path errno = %{public}d", errno);
148 
149     std::string verifiedPath(realPath);
150     filePtr = fopen(verifiedPath.append(fileName).c_str(), "rb");
151     CHECK_AND_RETURN_RET_LOG(filePtr != nullptr, ERROR, "Error opening pcm test file!");
152 
153     capturerInited_ = true;
154     return SUCCESS;
155 }
156 
CaptureFrame(char * frame,uint64_t requestBytes,uint64_t & replyBytes)157 int32_t AudioCapturerFileSource::CaptureFrame(char *frame, uint64_t requestBytes, uint64_t &replyBytes)
158 {
159     CHECK_AND_RETURN_RET_LOG(filePtr != nullptr, ERROR, "Invalid filePtr!");
160 
161     if (feof(filePtr)) {
162         AUDIO_INFO_LOG("End of the file reached, start reading from beginning");
163         rewind(filePtr);
164     }
165 
166     replyBytes = fread(frame, 1, requestBytes, filePtr);
167 
168     return SUCCESS;
169 }
170 
Start(void)171 int32_t AudioCapturerFileSource::Start(void)
172 {
173     return SUCCESS;
174 }
175 
Stop(void)176 int32_t AudioCapturerFileSource::Stop(void)
177 {
178     if (filePtr != nullptr) {
179         fclose(filePtr);
180         filePtr = nullptr;
181     }
182     return SUCCESS;
183 }
184 
GetAudioParameter(const AudioParamKey key,const std::string & condition)185 std::string AudioCapturerFileSource::GetAudioParameter(const AudioParamKey key, const std::string &condition)
186 {
187     AUDIO_WARNING_LOG("not supported yet");
188     return "";
189 }
190 
GetMaxAmplitude()191 float AudioCapturerFileSource::GetMaxAmplitude()
192 {
193     AUDIO_WARNING_LOG("getMaxAmplitude in audio cap file not support");
194     return 0;
195 }
196 
UpdateAppsUid(const int32_t appsUid[PA_MAX_OUTPUTS_PER_SOURCE],const size_t size)197 int32_t AudioCapturerFileSource::UpdateAppsUid(const int32_t appsUid[PA_MAX_OUTPUTS_PER_SOURCE], const size_t size)
198 {
199     AUDIO_WARNING_LOG("not supported.");
200     return ERR_NOT_SUPPORTED;
201 }
202 
UpdateAppsUid(const std::vector<int32_t> & appsUid)203 int32_t AudioCapturerFileSource::UpdateAppsUid(const std::vector<int32_t> &appsUid)
204 {
205     AUDIO_WARNING_LOG("not supported.");
206     return ERR_NOT_SUPPORTED;
207 }
208 } // namespace AudioStandard
209 } // namespace OHOS
210