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