1e0e9324cSopenharmony_ci/*
2e0e9324cSopenharmony_ci * Copyright (c) 2023 Shenzhen Kaihong Digital Industry Development Co., Ltd.
3e0e9324cSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4e0e9324cSopenharmony_ci * you may not use this file except in compliance with the License.
5e0e9324cSopenharmony_ci * You may obtain a copy of the License at
6e0e9324cSopenharmony_ci *
7e0e9324cSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8e0e9324cSopenharmony_ci *
9e0e9324cSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10e0e9324cSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11e0e9324cSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12e0e9324cSopenharmony_ci * See the License for the specific language governing permissions and
13e0e9324cSopenharmony_ci * limitations under the License.
14e0e9324cSopenharmony_ci */
15e0e9324cSopenharmony_ci
16e0e9324cSopenharmony_ci#include "audio_player.h"
17e0e9324cSopenharmony_ci#include "common/media_log.h"
18e0e9324cSopenharmony_ci#include "protocol/frame/aac_frame.h"
19e0e9324cSopenharmony_ci#include "protocol/frame/frame.h"
20e0e9324cSopenharmony_ci
21e0e9324cSopenharmony_cinamespace OHOS {
22e0e9324cSopenharmony_cinamespace Sharing {
23e0e9324cSopenharmony_ci
24e0e9324cSopenharmony_ciAudioPlayer::~AudioPlayer()
25e0e9324cSopenharmony_ci{
26e0e9324cSopenharmony_ci    SHARING_LOGD("trace.");
27e0e9324cSopenharmony_ci    Release();
28e0e9324cSopenharmony_ci}
29e0e9324cSopenharmony_ci
30e0e9324cSopenharmony_cibool AudioPlayer::Init(CodecId audioCodecId)
31e0e9324cSopenharmony_ci{
32e0e9324cSopenharmony_ci    SHARING_LOGD("trace.");
33e0e9324cSopenharmony_ci    playerId_ = GetId();
34e0e9324cSopenharmony_ci    audioCodecId_ = audioCodecId;
35e0e9324cSopenharmony_ci    audioSink_ = std::make_shared<AudioSink>(playerId_);
36e0e9324cSopenharmony_ci    audioDecoderReceiver_ = std::make_shared<AudioDecoderReceiver>(audioSink_);
37e0e9324cSopenharmony_ci
38e0e9324cSopenharmony_ci    audioDecoder_ = CodecFactory::CreateAudioDecoder(audioCodecId_);
39e0e9324cSopenharmony_ci    if (audioDecoder_ == nullptr) {
40e0e9324cSopenharmony_ci        SHARING_LOGE("CreateAudioDecoder failed for CodecId:%{public}d!", (int32_t)audioCodecId_);
41e0e9324cSopenharmony_ci        return false;
42e0e9324cSopenharmony_ci    }
43e0e9324cSopenharmony_ci
44e0e9324cSopenharmony_ci    audioDecoder_->Init();
45e0e9324cSopenharmony_ci    return true;
46e0e9324cSopenharmony_ci}
47e0e9324cSopenharmony_ci
48e0e9324cSopenharmony_cibool AudioPlayer::SetAudioFormat(int32_t channel, int32_t sampleRate)
49e0e9324cSopenharmony_ci{
50e0e9324cSopenharmony_ci    SHARING_LOGD("trace.");
51e0e9324cSopenharmony_ci    channel_ = channel;
52e0e9324cSopenharmony_ci    sampleRate_ = sampleRate;
53e0e9324cSopenharmony_ci    return true;
54e0e9324cSopenharmony_ci}
55e0e9324cSopenharmony_ci
56e0e9324cSopenharmony_cibool AudioPlayer::Start()
57e0e9324cSopenharmony_ci{
58e0e9324cSopenharmony_ci    SHARING_LOGD("trace.");
59e0e9324cSopenharmony_ci    if (isRunning_) {
60e0e9324cSopenharmony_ci        SHARING_LOGW("audio player is running.");
61e0e9324cSopenharmony_ci        return true;
62e0e9324cSopenharmony_ci    }
63e0e9324cSopenharmony_ci
64e0e9324cSopenharmony_ci    if (CODEC_NONE == audioCodecId_ || nullptr == audioDecoder_ || nullptr == audioDecoderReceiver_ ||
65e0e9324cSopenharmony_ci        nullptr == audioSink_) {
66e0e9324cSopenharmony_ci        SHARING_LOGE("start must be after init, CodecId:%{public}d!", (int32_t)audioCodecId_);
67e0e9324cSopenharmony_ci        return false;
68e0e9324cSopenharmony_ci    }
69e0e9324cSopenharmony_ci
70e0e9324cSopenharmony_ci    if (audioSink_->Prepare(channel_, sampleRate_) != 0 || audioSink_->Start() != 0) {
71e0e9324cSopenharmony_ci        SHARING_LOGE("audio player start failed.");
72e0e9324cSopenharmony_ci        return false;
73e0e9324cSopenharmony_ci    }
74e0e9324cSopenharmony_ci
75e0e9324cSopenharmony_ci    audioDecoder_->AddAudioDestination(audioDecoderReceiver_);
76e0e9324cSopenharmony_ci    isRunning_ = true;
77e0e9324cSopenharmony_ci    return true;
78e0e9324cSopenharmony_ci}
79e0e9324cSopenharmony_ci
80e0e9324cSopenharmony_civoid AudioPlayer::SetVolume(float volume)
81e0e9324cSopenharmony_ci{
82e0e9324cSopenharmony_ci    SHARING_LOGD("trace.");
83e0e9324cSopenharmony_ci    if (audioSink_) {
84e0e9324cSopenharmony_ci        audioSink_->SetVolume(volume);
85e0e9324cSopenharmony_ci    }
86e0e9324cSopenharmony_ci}
87e0e9324cSopenharmony_ci
88e0e9324cSopenharmony_civoid AudioPlayer::Stop()
89e0e9324cSopenharmony_ci{
90e0e9324cSopenharmony_ci    SHARING_LOGD("trace.");
91e0e9324cSopenharmony_ci    if (isRunning_) {
92e0e9324cSopenharmony_ci        if (audioDecoder_) {
93e0e9324cSopenharmony_ci            audioDecoder_->RemoveAudioDestination(audioDecoderReceiver_);
94e0e9324cSopenharmony_ci        }
95e0e9324cSopenharmony_ci        if (audioSink_) {
96e0e9324cSopenharmony_ci            audioSink_->Stop();
97e0e9324cSopenharmony_ci        }
98e0e9324cSopenharmony_ci        isRunning_ = false;
99e0e9324cSopenharmony_ci    }
100e0e9324cSopenharmony_ci}
101e0e9324cSopenharmony_ci
102e0e9324cSopenharmony_civoid AudioPlayer::Release()
103e0e9324cSopenharmony_ci{
104e0e9324cSopenharmony_ci    SHARING_LOGD("trace.");
105e0e9324cSopenharmony_ci    if (audioSink_ != nullptr) {
106e0e9324cSopenharmony_ci        audioSink_->Release();
107e0e9324cSopenharmony_ci        audioSink_ = nullptr;
108e0e9324cSopenharmony_ci    }
109e0e9324cSopenharmony_ci}
110e0e9324cSopenharmony_ci
111e0e9324cSopenharmony_civoid AudioPlayer::ProcessAudioData(DataBuffer::Ptr data)
112e0e9324cSopenharmony_ci{
113e0e9324cSopenharmony_ci    MEDIA_LOGD("trace.");
114e0e9324cSopenharmony_ci    if (!isRunning_) {
115e0e9324cSopenharmony_ci        return;
116e0e9324cSopenharmony_ci    }
117e0e9324cSopenharmony_ci
118e0e9324cSopenharmony_ci    if (data == nullptr || audioDecoder_ == nullptr || data->Peek() == nullptr || data->Size() <= 0) {
119e0e9324cSopenharmony_ci        return;
120e0e9324cSopenharmony_ci    }
121e0e9324cSopenharmony_ci
122e0e9324cSopenharmony_ci    auto frame = FrameImpl::Create();
123e0e9324cSopenharmony_ci    frame->codecId_ = audioCodecId_;
124e0e9324cSopenharmony_ci    frame->Assign(data->Peek(), data->Size());
125e0e9324cSopenharmony_ci    audioDecoder_->OnFrame(frame);
126e0e9324cSopenharmony_ci}
127e0e9324cSopenharmony_ci
128e0e9324cSopenharmony_ci} // namespace Sharing
129e0e9324cSopenharmony_ci} // namespace OHOS