• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 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 #include "media_monitor_service.h"
17 #include <filesystem>
18 #include <sys/stat.h>
19 #include "system_ability_definition.h"
20 #include "parameters.h"
21 #include "log.h"
22 #include "monitor_error.h"
23 #include "media_audio_encoder.h"
24 #include "media_monitor_death_recipient.h"
25 #include "iservice_registry.h"
26 
27 namespace {
28 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, LOG_DOMAIN_FOUNDATION, "MediaMonitorService"};
29 }
30 
31 using namespace std;
32 
33 namespace OHOS {
34 namespace Media {
35 namespace MediaMonitor {
36 constexpr int32_t WAIT_DUMP_TIMEOUT_S = 1;
37 constexpr int32_t AUDIO_UID = 1041;
REGISTER_SYSTEM_ABILITY_BY_ID(MediaMonitorService,MEDIA_MONITOR_SERVICE_ID,true)38 REGISTER_SYSTEM_ABILITY_BY_ID(MediaMonitorService, MEDIA_MONITOR_SERVICE_ID, true)
39 
40 MediaMonitorService::MediaMonitorService(int32_t systemAbilityId, bool runOnCreate)
41     : SystemAbility(systemAbilityId, runOnCreate),
42     eventAggregate_(EventAggregate::GetEventAggregate()),
43     audioMemo_(AudioMemo::GetAudioMemo())
44 {
45         MEDIA_LOG_I("MediaMonitorService constructor");
46 }
47 
OnDump()48 void MediaMonitorService::OnDump()
49 {
50     MEDIA_LOG_I("OnDump");
51 }
52 
Dump(int32_t fd,const std::vector<std::u16string> & args)53 int32_t MediaMonitorService::Dump(int32_t fd, const std::vector<std::u16string> &args)
54 {
55     MEDIA_LOG_I("MediaMonitorService Dump");
56     std::string dumpString = "------------------MediaMonitor------------------\n";
57 
58     eventAggregate_.WriteInfo(fd, dumpString);
59     audioMemo_.WriteInfo(fd, dumpString);
60     write(fd, dumpString.c_str(), dumpString.size());
61     return SUCCESS;
62 }
63 
OnStart()64 void MediaMonitorService::OnStart()
65 {
66     MEDIA_LOG_I("OnStart");
67     bool res = Publish(this);
68     if (!res) {
69         MEDIA_LOG_I("publish sa err");
70         return;
71     }
72     signal_ = std::make_shared<MessageSignal>();
73     signal_->isRunning_.store(true);
74     messageLoopThread_ = make_unique<thread>(&MediaMonitorService::MessageLoopFunc, this);
75     pthread_setname_np(messageLoopThread_->native_handle(), "MMLoopThread");
76     versionType_ = OHOS::system::GetParameter("const.logsystem.versiontype", COMMERCIAL_VERSION);
77     MEDIA_LOG_I("MediaMonitorService get version type %{public}s", versionType_.c_str());
78 }
79 
OnStop()80 void MediaMonitorService::OnStop()
81 {
82     MEDIA_LOG_I("OnStop");
83     isExit_ = true;
84     signal_->isRunning_.store(false);
85     DumpThreadExit();
86 }
87 
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)88 void MediaMonitorService::OnAddSystemAbility(int32_t systemAbilityId, const std::string &deviceId)
89 {
90     MEDIA_LOG_I("systemAbilityId:%{public}d", systemAbilityId);
91 }
92 
OnRemoveSystemAbility(int32_t systemAbilityId,const std::string & deviceId)93 void MediaMonitorService::OnRemoveSystemAbility(int32_t systemAbilityId, const std::string &deviceId)
94 {
95     MEDIA_LOG_I("OnRemoveSystemAbility systemAbilityId:%{public}d removed", systemAbilityId);
96 }
97 
WriteLogMsg(const EventBean & bean)98 ErrCode MediaMonitorService::WriteLogMsg(const EventBean &bean)
99 {
100     MEDIA_LOG_D("Write event");
101     auto eventBean = std::make_shared<EventBean>(bean);
102     if (eventBean == nullptr) {
103         MEDIA_LOG_E("eventBean is nullptr");
104         return ERROR;
105     }
106     AddMessageToQueue(eventBean);
107     return SUCCESS;
108 }
109 
MessageLoopFunc()110 void MediaMonitorService::MessageLoopFunc()
111 {
112     MEDIA_LOG_D("MediaMonitorService MessageLoopFunc");
113     if (signal_ == nullptr) {
114         MEDIA_LOG_E("MediaMonitorService MessageLoopFunc signal_ is nullptr");
115         return;
116     }
117     while (!isExit_) {
118         if (!signal_->isRunning_.load()) {
119             break;
120         }
121         std::shared_ptr<EventBean> msg;
122         {
123             unique_lock<mutex> lock(signal_->messageMutex_);
124             signal_->messageCond_.wait(lock, [this]() { return signal_->messageQueue_.size() > 0; });
125             if (!signal_->isRunning_.load()) {
126                 break;
127             }
128             msg = signal_->messageQueue_.front();
129             if (msg == nullptr) {
130                 signal_->messageQueue_.pop();
131                 continue;
132             }
133             signal_->messageQueue_.pop();
134         }
135         GetMessageFromQueue(msg);
136     }
137 }
138 
GetMessageFromQueue(std::shared_ptr<EventBean> & message)139 void MediaMonitorService::GetMessageFromQueue(std::shared_ptr<EventBean> &message)
140 {
141     if (message == nullptr) {
142         MEDIA_LOG_E("eventBean is nullptr");
143         return;
144     }
145     eventAggregate_.WriteEvent(message);
146 }
147 
AddMessageToQueue(std::shared_ptr<EventBean> & message)148 void MediaMonitorService::AddMessageToQueue(std::shared_ptr<EventBean> &message)
149 {
150     MEDIA_LOG_D("MediaMonitorService AddMessageToQueue");
151     if (signal_ == nullptr) {
152         MEDIA_LOG_E("signal_ is null");
153         return;
154     }
155     unique_lock<mutex> lock(signal_->messageMutex_);
156     if (!signal_->isRunning_.load()) {
157         MEDIA_LOG_E("!isRunning_");
158         return;
159     }
160     signal_->messageQueue_.push(message);
161     signal_->messageCond_.notify_all();
162 }
163 
GetAudioRouteMsg(std::unordered_map<int32_t,MonitorDeviceInfo> & preferredDevices,int32_t & funcResult)164 ErrCode MediaMonitorService::GetAudioRouteMsg(std::unordered_map<int32_t,
165     MonitorDeviceInfo> &preferredDevices, int32_t &funcResult)
166 {
167     FALSE_UPDATE_RETURN_V_MSG_E(VerifyIsAudio(), funcResult, ERROR, "client permission denied");
168     MEDIA_LOG_D("MediaMonitorService GetAudioRouteMsg");
169     std::map<PreferredType, shared_ptr<MonitorDeviceInfo>> preferredDevicePtrs;
170     funcResult = audioMemo_.GetAudioRouteMsg(preferredDevicePtrs);
171     for (auto &devicePtr : preferredDevicePtrs) {
172         preferredDevices[static_cast<int32_t>(devicePtr.first)] = *devicePtr.second;
173     }
174     return funcResult;
175 }
176 
GetAudioExcludedDevicesMsg(std::unordered_map<int32_t,std::vector<MonitorDeviceInfo>> & excludedDevices,int32_t & funcResult)177 ErrCode MediaMonitorService::GetAudioExcludedDevicesMsg(std::unordered_map<int32_t,
178     std::vector<MonitorDeviceInfo>> &excludedDevices, int32_t &funcResult)
179 {
180     FALSE_UPDATE_RETURN_V_MSG_E(VerifyIsAudio(), funcResult, ERROR, "client permission denied");
181     MEDIA_LOG_D("MediaMonitorService GetAudioExcludedDevicesMsg");
182     std::map<AudioDeviceUsage, std::vector<std::shared_ptr<MonitorDeviceInfo>>> excludedDevicesPtr;
183     funcResult = audioMemo_.GetAudioExcludedDevicesMsg(excludedDevicesPtr);
184     for (auto &devicePtr : excludedDevicesPtr) {
185         std::vector<MonitorDeviceInfo> deviceInfos;
186         for (auto &deviceInfo : devicePtr.second) {
187             deviceInfos.push_back(*deviceInfo);
188         }
189         excludedDevices[static_cast<int32_t>(devicePtr.first)] = deviceInfos;
190     }
191     return funcResult;
192 }
193 
AudioEncodeDump()194 void MediaMonitorService::AudioEncodeDump()
195 {
196     MEDIA_LOG_I("encode pcm start");
197     std::shared_ptr<MediaAudioEncoder> encoder = std::make_shared<MediaAudioEncoder>();
198     encoder->EncodePcmFiles(fileFloader_);
199     encoder = nullptr;
200 }
201 
VerifyIsAudio()202 bool MediaMonitorService::VerifyIsAudio()
203 {
204     int32_t callingUid = IPCSkeleton::GetCallingUid();
205     if (callingUid == AUDIO_UID) {
206         return true;
207     }
208     return false;
209 }
210 
IsNeedDump()211 bool MediaMonitorService::IsNeedDump()
212 {
213     MEDIA_LOG_D("dumpType_:%{public}s, dumpEnable:%{public}d", dumpType_.c_str(), dumpEnable_);
214     if (versionType_ != BETA_VERSION) {
215         return false;
216     }
217     if (dumpType_ == DEFAULT_DUMP_TYPE || dumpType_ == BETA_DUMP_TYPE) {
218         return dumpEnable_;
219     }
220     return false;
221 }
222 
WriteAudioBuffer(const std::string & fileName,uint64_t ptr,uint32_t size,int32_t & funcResult)223 ErrCode MediaMonitorService::WriteAudioBuffer(const std::string &fileName, uint64_t ptr, uint32_t size,
224     int32_t &funcResult)
225 {
226     funcResult = SUCCESS;
227     return funcResult;
228 }
229 
GetInputBuffer(DumpBuffer & buffer,int32_t size,int32_t & funcResult)230 ErrCode MediaMonitorService::GetInputBuffer(DumpBuffer &buffer, int32_t size, int32_t &funcResult)
231 {
232     if (versionType_ != BETA_VERSION) {
233         funcResult = ERROR;
234         return funcResult;
235     }
236 
237     if (!IsNeedDump()) {
238         funcResult = ERR_ILLEGAL_STATE;
239         return funcResult;
240     }
241 
242     FALSE_UPDATE_RETURN_V_MSG_E(VerifyIsAudio(), funcResult, ERROR, "client permissionn denied");
243     unique_lock<mutex> lock(bufferMutex_);
244     if (audioBufferCache_) {
245         shared_ptr<DumpBuffer> dumpBuffer = std::make_shared<DumpBuffer>();
246         audioBufferCache_->RequestBuffer(dumpBuffer, size);
247         FALSE_UPDATE_RETURN_V_MSG_E(dumpBuffer != nullptr, funcResult, ERROR, "request buffer failed");
248         buffer = *dumpBuffer;
249     }
250     funcResult = SUCCESS;
251     return funcResult;
252 }
253 
InputBufferFilled(const std::string & fileName,uint64_t bufferId,uint32_t size,int32_t & funcResult)254 ErrCode MediaMonitorService::InputBufferFilled(const std::string &fileName, uint64_t bufferId, uint32_t size,
255     int32_t &funcResult)
256 {
257     if (versionType_ != BETA_VERSION) {
258         funcResult = ERROR;
259         return funcResult;
260     }
261 
262     FALSE_UPDATE_RETURN_V_MSG_E(VerifyIsAudio(), funcResult, ERROR, "client permissionn denied");
263     FALSE_UPDATE_RETURN_V_MSG_E(audioBufferCache_ != nullptr, funcResult, ERROR, "buffer cahce nullptr");
264     std::shared_ptr<DumpBuffer> buffer = nullptr;
265     audioBufferCache_->GetBufferById(buffer, bufferId);
266     FALSE_RETURN_V_MSG_E(buffer != nullptr, ERROR, "get buffer falied");
267     audioBufferCache_->SetBufferSize(buffer, size);
268     AddBufferToQueue(fileName, buffer);
269     funcResult = SUCCESS;
270     return funcResult;
271 }
272 
GetPcmDumpStatus(int32_t & dumpEnable,int32_t & funcResult)273 ErrCode MediaMonitorService::GetPcmDumpStatus(int32_t &dumpEnable, int32_t &funcResult)
274 {
275     if (versionType_ != BETA_VERSION) {
276         funcResult = ERROR;
277         return funcResult;
278     }
279 
280     FALSE_UPDATE_RETURN_V_MSG_E(VerifyIsAudio(), funcResult, ERROR, "client permissionn denied");
281     dumpEnable = dumpEnable_ ? 1 : 0;
282     funcResult = SUCCESS;
283     return funcResult;
284 }
285 
SetMediaParameters(const std::string & dumpType,const std::string & dumpEnable,int32_t & funcResult)286 ErrCode MediaMonitorService::SetMediaParameters(const std::string &dumpType, const std::string &dumpEnable,
287     int32_t &funcResult)
288 {
289     if (versionType_ != BETA_VERSION) {
290         funcResult = ERROR;
291         return funcResult;
292     }
293 
294     FALSE_UPDATE_RETURN_V_MSG_E(VerifyIsAudio(), funcResult, ERROR, "client permissionn denied");
295     MEDIA_LOG_D("SetMediaParameters dumpEnable: %{public}s", dumpEnable.c_str());
296     unique_lock<mutex> lock(paramMutex_);
297     if (dumpType != DEFAULT_DUMP_TYPE && dumpType != BETA_DUMP_TYPE) {
298         MEDIA_LOG_E("dumpType:%{public}s isvaild", dumpType.c_str());
299         funcResult = ERROR;
300         return funcResult;
301     }
302 
303     bool isDumpEnable = (dumpEnable == "true") ? true : false;
304     if (dumpEnable_ == isDumpEnable) {
305         MEDIA_LOG_D("set dumpType is repeate, current enable:%{public}d", dumpEnable_);
306         funcResult = ERROR;
307         return funcResult;
308     }
309 
310     dumpType_ = dumpType;
311     dumpEnable_ = isDumpEnable;
312     fileFloader_ = (dumpType_ == BETA_DUMP_TYPE) ? BETA_DUMP_DIR : DEFAULT_DUMP_DIR;
313     dumpThreadTime_ = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
314 
315     funcResult = DumpThreadProcess();
316     return funcResult;
317 }
318 
DumpThreadProcess()319 int32_t MediaMonitorService::DumpThreadProcess()
320 {
321     if (dumpSignal_ != nullptr) {
322         dumpSignal_->isRunning_.store(false);
323     }
324     if (dumpEnable_) {
325         isDumpExit_ = false;
326         if (dumpLoopThread_ && dumpLoopThread_->joinable()) {
327             dumpLoopThread_->join();
328         }
329         dumpBufferWrap_ = std::make_shared<DumpBufferWrap>();
330         if (!dumpBufferWrap_->Open()) {
331             return ERROR;
332         }
333         DumpThreadStart();
334     } else {
335         DumpThreadStop();
336     }
337     return SUCCESS;
338 }
339 
DumpThreadStart()340 void MediaMonitorService::DumpThreadStart()
341 {
342     MEDIA_LOG_I("DumpThreadStart enter");
343     DumpFileClear();
344     audioBufferCache_ = std::make_shared<AudioBufferCache>(dumpBufferWrap_);
345     dumpSignal_ = std::make_shared<DumpSignal>();
346     dumpSignal_->isRunning_.store(true);
347     dumpLoopThread_ = std::make_unique<thread>(&MediaMonitorService::DumpLoopFunc, this);
348     pthread_setname_np(dumpLoopThread_->native_handle(), "MDLoopThread");
349 }
350 
DumpThreadStop()351 void MediaMonitorService::DumpThreadStop()
352 {
353     MEDIA_LOG_I("DumpThreadStop enter");
354     dumpSignal_->isRunning_.store(false);
355     dumpEnable_ = false;
356     DumpBufferClear();
357     if (dumpType_ == BETA_DUMP_TYPE) {
358         HistoryFilesHandle();
359         AudioEncodeDump();
360     }
361     dumpType_ = DEFAULT_DUMP_TYPE;
362     fileFloader_ = DEFAULT_DUMP_DIR;
363 }
364 
DumpThreadExit()365 void MediaMonitorService::DumpThreadExit()
366 {
367     MEDIA_LOG_I("DumpThreadExit enter");
368     dumpEnable_ = false;
369     isDumpExit_ = true;
370     dumpSignal_->isRunning_.store(false);
371 }
372 
DumpLoopFunc()373 void MediaMonitorService::DumpLoopFunc()
374 {
375     MEDIA_LOG_I("DumpLoopFunc enter");
376     FALSE_RETURN_MSG(dumpSignal_ != nullptr, "signal is nullptr");
377     FALSE_RETURN_MSG(dumpBufferWrap_ != nullptr, "buffer wrap is nullptr");
378     while (!isDumpExit_) {
379         if (!dumpSignal_->isRunning_.load()) {
380             MEDIA_LOG_I("DumpLoopFunc running exit");
381             break;
382         }
383         std::queue<std::pair<std::string, std::shared_ptr<DumpBuffer>>> tmpBufferQue;
384         {
385             unique_lock<mutex> lock(dumpSignal_->dumpMutex_);
386             dumpSignal_->dumpCond_.wait_for(lock, std::chrono::seconds(WAIT_DUMP_TIMEOUT_S), [this]() {
387                 return dumpSignal_->dumpQueue_.size() > 0;
388             });
389             tmpBufferQue.swap(dumpSignal_->dumpQueue_);
390         }
391 
392         DumpBufferWrite(tmpBufferQue);
393         int duration = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()) - dumpThreadTime_;
394         if (dumpType_ == BETA_DUMP_TYPE && duration >= MAX_DUMP_TIME) {
395             MEDIA_LOG_I("dump duration %{public}d", duration);
396             DumpThreadStop();
397         }
398     }
399     if (audioBufferCache_ != nullptr) {
400         audioBufferCache_->Clear();
401         audioBufferCache_ = nullptr;
402     }
403     if (dumpBufferWrap_ != nullptr) {
404         dumpBufferWrap_->Close();
405         dumpBufferWrap_ = nullptr;
406     }
407 }
408 
DumpBufferWrite(std::queue<std::pair<std::string,std::shared_ptr<DumpBuffer>>> & bufferQueue)409 void MediaMonitorService::DumpBufferWrite(std::queue<std::pair<std::string, std::shared_ptr<DumpBuffer>>> &bufferQueue)
410 {
411     std::pair<std::string, std::shared_ptr<DumpBuffer>> dumpData;
412     while (!bufferQueue.empty()) {
413         dumpData = bufferQueue.front();
414         bufferQueue.pop();
415         if (dumpEnable_) {
416             WriteBufferFromQueue(dumpData.first, dumpData.second);
417         }
418         AudioBufferRelease(dumpData.second);
419     }
420 }
421 
AddBufferToQueue(const std::string & fileName,std::shared_ptr<DumpBuffer> & buffer)422 void MediaMonitorService::AddBufferToQueue(const std::string &fileName, std::shared_ptr<DumpBuffer> &buffer)
423 {
424     MEDIA_LOG_D("AddBufferToQueue enter");
425     FALSE_RETURN_MSG(dumpSignal_ != nullptr, "signal is nullptr");
426     unique_lock<mutex> lock(dumpSignal_->dumpMutex_);
427     if (!dumpSignal_->isRunning_.load()) {
428         MEDIA_LOG_E("not running");
429         return;
430     }
431     dumpSignal_->dumpQueue_.push(std::make_pair(fileName, buffer));
432     dumpSignal_->dumpCond_.notify_all();
433 }
434 
WriteBufferFromQueue(const std::string & fileName,std::shared_ptr<DumpBuffer> & buffer)435 void MediaMonitorService::WriteBufferFromQueue(const std::string &fileName, std::shared_ptr<DumpBuffer> &buffer)
436 {
437     MEDIA_LOG_D("WriteBufferFromQueue enter");
438     FALSE_RETURN_MSG(buffer != nullptr, "buffer is nullptr");
439     std::string realFilePath = fileFloader_ + fileName;
440     FALSE_RETURN_MSG(IsRealPath(fileFloader_), "check path failed");
441     FILE *dumpFile = fopen(realFilePath.c_str(), "a");
442     FALSE_RETURN_MSG(dumpFile != nullptr, "pcm file open failed");
443     if (fseek(dumpFile, 0, SEEK_END)) {
444         (void)fclose(dumpFile);
445         return;
446     }
447     int filelen = ftell(dumpFile);
448     if (filelen >= FILE_MAX_SIZE && dumpType_ == BETA_DUMP_TYPE) {
449         (void)fclose(dumpFile);
450         (void)DeleteHistoryFile(realFilePath);
451         dumpFile = fopen(realFilePath.c_str(), "a");
452         FALSE_RETURN_MSG(dumpFile != nullptr, "reopen file failed");
453     }
454     size_t bufferSize = static_cast<size_t>(dumpBufferWrap_->GetSize(buffer.get()));
455     uint8_t *bufferAddr = dumpBufferWrap_->GetAddr(buffer.get());
456     if (bufferAddr == nullptr) {
457         (void)fclose(dumpFile);
458         dumpFile = nullptr;
459         return;
460     }
461     (void)fwrite(bufferAddr, 1, bufferSize, dumpFile);
462     (void)fclose(dumpFile);
463     dumpFile = nullptr;
464 }
465 
DumpFileClear()466 void MediaMonitorService::DumpFileClear()
467 {
468     std::error_code errorCode;
469     std::filesystem::directory_iterator iter(BETA_DUMP_DIR, errorCode);
470     if (errorCode) {
471         MEDIA_LOG_E("get file failed");
472         return;
473     }
474 
475     for (const auto &elem : iter) {
476         (void)DeleteHistoryFile(elem.path().string());
477     }
478 }
479 
DumpBufferClear()480 void MediaMonitorService::DumpBufferClear()
481 {
482     dumpSignal_->dumpMutex_.lock();
483     while (!dumpSignal_->dumpQueue_.empty()) {
484         auto &dumpData = dumpSignal_->dumpQueue_.front();
485         AudioBufferRelease(dumpData.second);
486         dumpSignal_->dumpQueue_.pop();
487     }
488     dumpSignal_->dumpMutex_.unlock();
489 }
490 
AudioBufferRelease(std::shared_ptr<DumpBuffer> & buffer)491 void MediaMonitorService::AudioBufferRelease(std::shared_ptr<DumpBuffer> &buffer)
492 {
493     FALSE_RETURN_MSG(buffer != nullptr, "buffer is nullptr");
494     if (audioBufferCache_) {
495         audioBufferCache_->ReleaseBuffer(buffer);
496     }
497 }
498 
HistoryFilesHandle()499 void MediaMonitorService::HistoryFilesHandle()
500 {
501     MEDIA_LOG_D("HistoryFilesHandle enter");
502     if (dumpType_ != BETA_DUMP_TYPE) {
503         return;
504     }
505 
506     std::error_code errorCode;
507     std::filesystem::directory_iterator iter(fileFloader_, errorCode);
508     if (errorCode) {
509         MEDIA_LOG_E("get file failed");
510         return;
511     }
512     std::vector<std::filesystem::path> mediaFileVecs;
513     for (const auto &elem : iter) {
514         if (std::filesystem::is_regular_file(elem.status())) {
515             mediaFileVecs.emplace_back(elem.path());
516         }
517     }
518     MEDIA_LOG_D("HistoryFilesHandle dumpType %{public}s size: %{public}d",
519         dumpType_.c_str(), (int)mediaFileVecs.size());
520     std::sort(mediaFileVecs.begin(), mediaFileVecs.end(),
521         [](const std::filesystem::path &file1, const std::filesystem::path &file2) {
522             return std::filesystem::file_time_type(std::filesystem::last_write_time(file1)) <
523             std::filesystem::file_time_type(std::filesystem::last_write_time(file2));
524     });
525     while (static_cast<int>(mediaFileVecs.size()) > MAX_FILE_COUNT) {
526         std::string delFilePath = (mediaFileVecs.front()).string();
527         if (DeleteHistoryFile(delFilePath) && !mediaFileVecs.empty()) {
528             mediaFileVecs.erase(mediaFileVecs.begin());
529         }
530     }
531     MEDIA_LOG_I("HistoryFilesHandle exit");
532 }
533 
DeleteHistoryFile(const std::string & filePath)534 bool MediaMonitorService::DeleteHistoryFile(const std::string &filePath)
535 {
536     MEDIA_LOG_I("DeleteHistoryFile enter");
537     if (!IsRealPath(filePath)) {
538         return false;
539     }
540     (void)chmod(filePath.c_str(), FILE_MODE);
541     if (remove(filePath.c_str()) != 0) {
542         MEDIA_LOG_E("remove file failed ");
543         return false;
544     }
545     return true;
546 }
547 
ErasePreferredDeviceByType(int32_t preferredType,int32_t & funcResult)548 ErrCode MediaMonitorService::ErasePreferredDeviceByType(int32_t preferredType, int32_t &funcResult)
549 {
550     FALSE_UPDATE_RETURN_V_MSG_E(VerifyIsAudio(), funcResult, ERROR, "client permission denied");
551     MEDIA_LOG_D("ErasePreferredDeviceByType enter");
552     funcResult = audioMemo_.ErasePreferredDeviceByType(static_cast<PreferredType>(preferredType));
553     return funcResult;
554 }
555 } // namespace MediaMonitor
556 } // namespace Media
557 } // namespace OHOS