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