1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2022-2023 Huawei Device Co., Ltd. 3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License. 5094332d3Sopenharmony_ci * You may obtain a copy of the License at 6094332d3Sopenharmony_ci * 7094332d3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8094332d3Sopenharmony_ci * 9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and 13094332d3Sopenharmony_ci * limitations under the License. 14094332d3Sopenharmony_ci */ 15094332d3Sopenharmony_ci 16094332d3Sopenharmony_ci#include <dlfcn.h> 17094332d3Sopenharmony_ci#include <limits.h> 18094332d3Sopenharmony_ci#include <pthread.h> 19094332d3Sopenharmony_ci#include <securec.h> 20094332d3Sopenharmony_ci#include <signal.h> 21094332d3Sopenharmony_ci#include <stdio.h> 22094332d3Sopenharmony_ci#include <stdlib.h> 23094332d3Sopenharmony_ci#include <string.h> 24094332d3Sopenharmony_ci#include <sys/mman.h> 25094332d3Sopenharmony_ci#include <sys/stat.h> 26094332d3Sopenharmony_ci#include <unistd.h> 27094332d3Sopenharmony_ci#include "framework_common.h" 28094332d3Sopenharmony_ci#include "hdf_base.h" 29094332d3Sopenharmony_ci#include "inttypes.h" 30094332d3Sopenharmony_ci#include "osal_mem.h" 31094332d3Sopenharmony_ci#include "v4_0/audio_types.h" 32094332d3Sopenharmony_ci#include "v4_0/iaudio_manager.h" 33094332d3Sopenharmony_ci 34094332d3Sopenharmony_ci#define MAX_AUDIO_ADAPTER_DESC 5 35094332d3Sopenharmony_ci#define BUFFER_LEN 256 36094332d3Sopenharmony_ci#define AUDIO_CHANNELCOUNT 2 37094332d3Sopenharmony_ci#define AUDIO_SAMPLE_RATE_48K 48000 38094332d3Sopenharmony_ci#define PATH_LEN 256 39094332d3Sopenharmony_ci#define DEEP_BUFFER_RENDER_PERIOD_SIZE 4096 40094332d3Sopenharmony_ci#define INT_32_MAX 0x7fffffff 41094332d3Sopenharmony_ci#define EXT_PARAMS_MAXLEN 107 42094332d3Sopenharmony_ci#define BITS_TO_FROMAT 3 43094332d3Sopenharmony_ci 44094332d3Sopenharmony_cistruct StrPara { 45094332d3Sopenharmony_ci struct IAudioRender *render; 46094332d3Sopenharmony_ci FILE *file; 47094332d3Sopenharmony_ci struct AudioSampleAttributes attrs; 48094332d3Sopenharmony_ci uint64_t *replyBytes; 49094332d3Sopenharmony_ci char *frame; 50094332d3Sopenharmony_ci int32_t bufferSize; 51094332d3Sopenharmony_ci}; 52094332d3Sopenharmony_ci 53094332d3Sopenharmony_cistruct IAudioRender *g_render = NULL; 54094332d3Sopenharmony_cistruct IAudioAdapter *g_adapter = NULL; 55094332d3Sopenharmony_cistatic struct IAudioManager *g_audioManager = NULL; 56094332d3Sopenharmony_cistruct AudioDeviceDescriptor g_devDesc; 57094332d3Sopenharmony_cistruct AudioSampleAttributes g_attrs; 58094332d3Sopenharmony_cistruct AudioPort g_audioPort; 59094332d3Sopenharmony_cistruct AudioHeadInfo g_wavHeadInfo; 60094332d3Sopenharmony_cistatic struct StrPara g_str; 61094332d3Sopenharmony_ciuint32_t g_renderId = 0; 62094332d3Sopenharmony_ci 63094332d3Sopenharmony_cipthread_t g_tids; 64094332d3Sopenharmony_cichar *g_frame = NULL; 65094332d3Sopenharmony_ciFILE *g_file; 66094332d3Sopenharmony_ci 67094332d3Sopenharmony_cichar g_path[256]; 68094332d3Sopenharmony_cichar g_adapterName[PATH_LEN] = {0}; 69094332d3Sopenharmony_cistatic int32_t g_closeEnd = 0; 70094332d3Sopenharmony_cipthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER; 71094332d3Sopenharmony_cipthread_cond_t g_functionCond = PTHREAD_COND_INITIALIZER; 72094332d3Sopenharmony_cibool g_waitSleep = false; 73094332d3Sopenharmony_cibool g_isDirect = true; 74094332d3Sopenharmony_ci 75094332d3Sopenharmony_cienum RenderMenuId { 76094332d3Sopenharmony_ci RENDER_START = 1, 77094332d3Sopenharmony_ci RENDER_STOP, 78094332d3Sopenharmony_ci RENDER_RESUME, 79094332d3Sopenharmony_ci RENDER_PAUSE, 80094332d3Sopenharmony_ci SET_RENDER_VOLUME, 81094332d3Sopenharmony_ci SET_RENDER_GAIN, 82094332d3Sopenharmony_ci SET_RENDER_MUTE, 83094332d3Sopenharmony_ci SET_RENDER_ATTRIBUTES, 84094332d3Sopenharmony_ci SET_RENDER_SLECET_SCENE, 85094332d3Sopenharmony_ci GET_RENDER_EXT_PARAMS, 86094332d3Sopenharmony_ci GET_RENDER_POSITION, 87094332d3Sopenharmony_ci}; 88094332d3Sopenharmony_ci 89094332d3Sopenharmony_cienum RenderInputType { 90094332d3Sopenharmony_ci INPUT_INT = 0, 91094332d3Sopenharmony_ci INPUT_FLOAT, 92094332d3Sopenharmony_ci INPUT_UINT32, 93094332d3Sopenharmony_ci}; 94094332d3Sopenharmony_ci 95094332d3Sopenharmony_citypedef int32_t (*AudioRenderOperation)(struct IAudioRender **); 96094332d3Sopenharmony_ci 97094332d3Sopenharmony_cistruct ProcessRenderMenuSwitchList { 98094332d3Sopenharmony_ci enum RenderMenuId cmd; 99094332d3Sopenharmony_ci AudioRenderOperation operation; 100094332d3Sopenharmony_ci}; 101094332d3Sopenharmony_ci 102094332d3Sopenharmony_cistatic int32_t CheckInputName(int type, void *val) 103094332d3Sopenharmony_ci{ 104094332d3Sopenharmony_ci if (val == NULL) { 105094332d3Sopenharmony_ci return HDF_FAILURE; 106094332d3Sopenharmony_ci } 107094332d3Sopenharmony_ci 108094332d3Sopenharmony_ci int ret; 109094332d3Sopenharmony_ci int inputInt = 0; 110094332d3Sopenharmony_ci float inputFloat = 0.0; 111094332d3Sopenharmony_ci uint32_t inputUint = 0; 112094332d3Sopenharmony_ci 113094332d3Sopenharmony_ci printf("\n"); 114094332d3Sopenharmony_ci switch (type) { 115094332d3Sopenharmony_ci case INPUT_INT: 116094332d3Sopenharmony_ci ret = scanf_s("%d", &inputInt); 117094332d3Sopenharmony_ci if (inputInt < 0 || inputInt > GET_RENDER_POSITION + 1) { 118094332d3Sopenharmony_ci if (g_frame != NULL) { 119094332d3Sopenharmony_ci OsalMemFree(g_frame); 120094332d3Sopenharmony_ci g_frame = NULL; 121094332d3Sopenharmony_ci } 122094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("Input failure"); 123094332d3Sopenharmony_ci return HDF_FAILURE; 124094332d3Sopenharmony_ci } 125094332d3Sopenharmony_ci 126094332d3Sopenharmony_ci *(int *)val = inputInt; 127094332d3Sopenharmony_ci break; 128094332d3Sopenharmony_ci case INPUT_FLOAT: 129094332d3Sopenharmony_ci ret = scanf_s("%f", &inputFloat); 130094332d3Sopenharmony_ci 131094332d3Sopenharmony_ci *(float *)val = inputFloat; 132094332d3Sopenharmony_ci break; 133094332d3Sopenharmony_ci case INPUT_UINT32: 134094332d3Sopenharmony_ci ret = scanf_s("%u", &inputUint); 135094332d3Sopenharmony_ci if (inputUint > 0xFFFFFFFF) { 136094332d3Sopenharmony_ci return HDF_FAILURE; 137094332d3Sopenharmony_ci } 138094332d3Sopenharmony_ci 139094332d3Sopenharmony_ci *(uint32_t *)val = inputUint; 140094332d3Sopenharmony_ci break; 141094332d3Sopenharmony_ci default: 142094332d3Sopenharmony_ci ret = EOF; 143094332d3Sopenharmony_ci break; 144094332d3Sopenharmony_ci } 145094332d3Sopenharmony_ci 146094332d3Sopenharmony_ci if (ret == 0) { 147094332d3Sopenharmony_ci CleanStdin(); 148094332d3Sopenharmony_ci } else if (ret == EOF) { 149094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("Input failure occurs!"); 150094332d3Sopenharmony_ci return HDF_FAILURE; 151094332d3Sopenharmony_ci } 152094332d3Sopenharmony_ci return HDF_SUCCESS; 153094332d3Sopenharmony_ci} 154094332d3Sopenharmony_ci 155094332d3Sopenharmony_cistatic int32_t InitAttrs(struct AudioSampleAttributes *attrs) 156094332d3Sopenharmony_ci{ 157094332d3Sopenharmony_ci if (attrs == NULL) { 158094332d3Sopenharmony_ci return HDF_FAILURE; 159094332d3Sopenharmony_ci } 160094332d3Sopenharmony_ci /* Initialization of audio parameters for playback */ 161094332d3Sopenharmony_ci attrs->format = AUDIO_FORMAT_TYPE_PCM_16_BIT; 162094332d3Sopenharmony_ci attrs->channelCount = AUDIO_CHANNELCOUNT; 163094332d3Sopenharmony_ci attrs->sampleRate = AUDIO_SAMPLE_RATE_48K; 164094332d3Sopenharmony_ci attrs->interleaved = 0; 165094332d3Sopenharmony_ci attrs->type = AUDIO_IN_MEDIA; 166094332d3Sopenharmony_ci attrs->period = DEEP_BUFFER_RENDER_PERIOD_SIZE; 167094332d3Sopenharmony_ci attrs->frameSize = PCM_16_BIT * attrs->channelCount / PCM_8_BIT; 168094332d3Sopenharmony_ci attrs->isBigEndian = false; 169094332d3Sopenharmony_ci attrs->isSignedData = true; 170094332d3Sopenharmony_ci attrs->startThreshold = DEEP_BUFFER_RENDER_PERIOD_SIZE / (attrs->frameSize); 171094332d3Sopenharmony_ci attrs->stopThreshold = INT_32_MAX; 172094332d3Sopenharmony_ci attrs->silenceThreshold = 0; 173094332d3Sopenharmony_ci return HDF_SUCCESS; 174094332d3Sopenharmony_ci} 175094332d3Sopenharmony_ci 176094332d3Sopenharmony_cistatic int32_t InitDevDesc(struct AudioDeviceDescriptor *devDesc, uint32_t portId) 177094332d3Sopenharmony_ci{ 178094332d3Sopenharmony_ci if (devDesc == NULL) { 179094332d3Sopenharmony_ci return HDF_FAILURE; 180094332d3Sopenharmony_ci } 181094332d3Sopenharmony_ci /* Initialization of audio parameters for playback */ 182094332d3Sopenharmony_ci devDesc->portId = portId; 183094332d3Sopenharmony_ci devDesc->pins = PIN_OUT_SPEAKER; 184094332d3Sopenharmony_ci devDesc->desc = strdup("cardname"); 185094332d3Sopenharmony_ci return HDF_SUCCESS; 186094332d3Sopenharmony_ci} 187094332d3Sopenharmony_ci 188094332d3Sopenharmony_cistatic void StreamClose(int32_t sig) 189094332d3Sopenharmony_ci{ 190094332d3Sopenharmony_ci /* allow the stream to be closed gracefully */ 191094332d3Sopenharmony_ci (void)signal(sig, SIG_IGN); 192094332d3Sopenharmony_ci g_closeEnd = 1; 193094332d3Sopenharmony_ci} 194094332d3Sopenharmony_ci 195094332d3Sopenharmony_cistatic uint32_t PcmFramesToBytes(const struct AudioSampleAttributes attrs) 196094332d3Sopenharmony_ci{ 197094332d3Sopenharmony_ci return DEEP_BUFFER_RENDER_PERIOD_SIZE * attrs.channelCount * (PcmFormatToBits(attrs.format) >> BITS_TO_FROMAT); 198094332d3Sopenharmony_ci} 199094332d3Sopenharmony_ci 200094332d3Sopenharmony_cistatic int32_t StopAudioFiles(struct IAudioRender **renderS) 201094332d3Sopenharmony_ci{ 202094332d3Sopenharmony_ci if (renderS == NULL) { 203094332d3Sopenharmony_ci return HDF_FAILURE; 204094332d3Sopenharmony_ci } 205094332d3Sopenharmony_ci if (g_waitSleep) { 206094332d3Sopenharmony_ci pthread_mutex_lock(&g_mutex); 207094332d3Sopenharmony_ci g_waitSleep = false; 208094332d3Sopenharmony_ci pthread_cond_signal(&g_functionCond); 209094332d3Sopenharmony_ci pthread_mutex_unlock(&g_mutex); 210094332d3Sopenharmony_ci } 211094332d3Sopenharmony_ci if (!g_closeEnd) { 212094332d3Sopenharmony_ci g_closeEnd = true; 213094332d3Sopenharmony_ci usleep(100000); // sleep 100000us 214094332d3Sopenharmony_ci } 215094332d3Sopenharmony_ci 216094332d3Sopenharmony_ci struct IAudioRender *render = *renderS; 217094332d3Sopenharmony_ci if (render == NULL) { 218094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("render is null"); 219094332d3Sopenharmony_ci return HDF_FAILURE; 220094332d3Sopenharmony_ci } 221094332d3Sopenharmony_ci 222094332d3Sopenharmony_ci int32_t ret = render->Stop((void *)render); 223094332d3Sopenharmony_ci if (ret < 0) { 224094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("Stop Render!"); 225094332d3Sopenharmony_ci } 226094332d3Sopenharmony_ci 227094332d3Sopenharmony_ci if (g_adapter == NULL || g_adapter->DestroyRender == NULL) { 228094332d3Sopenharmony_ci return HDF_FAILURE; 229094332d3Sopenharmony_ci } 230094332d3Sopenharmony_ci 231094332d3Sopenharmony_ci ret = g_adapter->DestroyRender(g_adapter, g_renderId); 232094332d3Sopenharmony_ci if (ret < 0) { 233094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("Destroy Render!"); 234094332d3Sopenharmony_ci } 235094332d3Sopenharmony_ci 236094332d3Sopenharmony_ci IAudioRenderRelease(render, g_isDirect); 237094332d3Sopenharmony_ci 238094332d3Sopenharmony_ci *renderS = NULL; 239094332d3Sopenharmony_ci g_render = NULL; 240094332d3Sopenharmony_ci if (g_frame != NULL) { 241094332d3Sopenharmony_ci OsalMemFree(g_frame); 242094332d3Sopenharmony_ci g_frame = NULL; 243094332d3Sopenharmony_ci } 244094332d3Sopenharmony_ci 245094332d3Sopenharmony_ci if (g_file != NULL) { 246094332d3Sopenharmony_ci fclose(g_file); 247094332d3Sopenharmony_ci g_file = NULL; 248094332d3Sopenharmony_ci } 249094332d3Sopenharmony_ci printf("Stop Successful\n"); 250094332d3Sopenharmony_ci return ret; 251094332d3Sopenharmony_ci} 252094332d3Sopenharmony_ci 253094332d3Sopenharmony_cistatic int32_t FrameStartMmap(const struct StrPara *param) 254094332d3Sopenharmony_ci{ 255094332d3Sopenharmony_ci if (param == NULL) { 256094332d3Sopenharmony_ci return HDF_FAILURE; 257094332d3Sopenharmony_ci } 258094332d3Sopenharmony_ci const struct StrPara *strParam = param; 259094332d3Sopenharmony_ci struct IAudioRender *render = strParam->render; 260094332d3Sopenharmony_ci struct AudioMmapBufferDescriptor mmapDesc; 261094332d3Sopenharmony_ci 262094332d3Sopenharmony_ci (void)signal(SIGINT, StreamClose); 263094332d3Sopenharmony_ci 264094332d3Sopenharmony_ci // get file length 265094332d3Sopenharmony_ci char pathBuf[PATH_MAX] = {'\0'}; 266094332d3Sopenharmony_ci if (realpath(g_path, pathBuf) == NULL) { 267094332d3Sopenharmony_ci return HDF_FAILURE; 268094332d3Sopenharmony_ci } 269094332d3Sopenharmony_ci 270094332d3Sopenharmony_ci // get fileSize 271094332d3Sopenharmony_ci FILE *fp = fopen(pathBuf, "rb+"); 272094332d3Sopenharmony_ci if (fp == NULL) { 273094332d3Sopenharmony_ci printf("Open file failed!\n"); 274094332d3Sopenharmony_ci return HDF_FAILURE; 275094332d3Sopenharmony_ci } 276094332d3Sopenharmony_ci 277094332d3Sopenharmony_ci int32_t ret = fseek(fp, 0, SEEK_END); 278094332d3Sopenharmony_ci if (ret != 0) { 279094332d3Sopenharmony_ci fclose(fp); 280094332d3Sopenharmony_ci return HDF_FAILURE; 281094332d3Sopenharmony_ci } 282094332d3Sopenharmony_ci 283094332d3Sopenharmony_ci int32_t reqSize = (int32_t)ftell(fp); 284094332d3Sopenharmony_ci if (reqSize < 0) { 285094332d3Sopenharmony_ci fclose(fp); 286094332d3Sopenharmony_ci return HDF_FAILURE; 287094332d3Sopenharmony_ci } 288094332d3Sopenharmony_ci (void)fclose(fp); 289094332d3Sopenharmony_ci // Init param 290094332d3Sopenharmony_ci mmapDesc.memoryFd = 0; // default 0 291094332d3Sopenharmony_ci mmapDesc.filePath = strdup(pathBuf); 292094332d3Sopenharmony_ci mmapDesc.isShareable = 1; // 1:Shareable ,0:Don't share 293094332d3Sopenharmony_ci mmapDesc.transferFrameSize = DEEP_BUFFER_RENDER_PERIOD_SIZE / 4; // One frame size 4 bit 294094332d3Sopenharmony_ci mmapDesc.offset = sizeof(g_wavHeadInfo); 295094332d3Sopenharmony_ci 296094332d3Sopenharmony_ci // start 297094332d3Sopenharmony_ci if (render == NULL || render->ReqMmapBuffer == NULL) { 298094332d3Sopenharmony_ci free(mmapDesc.filePath); 299094332d3Sopenharmony_ci return HDF_FAILURE; 300094332d3Sopenharmony_ci } 301094332d3Sopenharmony_ci 302094332d3Sopenharmony_ci ret = render->ReqMmapBuffer(render, reqSize, &mmapDesc); 303094332d3Sopenharmony_ci if (ret < 0 || reqSize <= 0) { 304094332d3Sopenharmony_ci free(mmapDesc.filePath); 305094332d3Sopenharmony_ci printf("Request map fail,please check.\n"); 306094332d3Sopenharmony_ci return HDF_FAILURE; 307094332d3Sopenharmony_ci } 308094332d3Sopenharmony_ci 309094332d3Sopenharmony_ci if (g_render != NULL) { 310094332d3Sopenharmony_ci ret = StopAudioFiles(&render); 311094332d3Sopenharmony_ci if (ret < 0) { 312094332d3Sopenharmony_ci free(mmapDesc.filePath); 313094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("StopAudioFiles File!"); 314094332d3Sopenharmony_ci } 315094332d3Sopenharmony_ci } 316094332d3Sopenharmony_ci free(mmapDesc.filePath); 317094332d3Sopenharmony_ci return HDF_SUCCESS; 318094332d3Sopenharmony_ci} 319094332d3Sopenharmony_ci 320094332d3Sopenharmony_cistatic int32_t FrameStart(const struct StrPara *param) 321094332d3Sopenharmony_ci{ 322094332d3Sopenharmony_ci if (param == NULL) { 323094332d3Sopenharmony_ci return HDF_FAILURE; 324094332d3Sopenharmony_ci } 325094332d3Sopenharmony_ci 326094332d3Sopenharmony_ci size_t numRead; 327094332d3Sopenharmony_ci char *frame = param->frame; 328094332d3Sopenharmony_ci int32_t bufferSize = param->bufferSize; 329094332d3Sopenharmony_ci struct IAudioRender *render = param->render; 330094332d3Sopenharmony_ci size_t remainingDataSize = g_wavHeadInfo.riffSize; 331094332d3Sopenharmony_ci 332094332d3Sopenharmony_ci (void)signal(SIGINT, StreamClose); 333094332d3Sopenharmony_ci if (g_file == NULL) { 334094332d3Sopenharmony_ci return HDF_FAILURE; 335094332d3Sopenharmony_ci } 336094332d3Sopenharmony_ci 337094332d3Sopenharmony_ci if (render == NULL || render->RenderFrame == NULL || frame == NULL) { 338094332d3Sopenharmony_ci return HDF_FAILURE; 339094332d3Sopenharmony_ci } 340094332d3Sopenharmony_ci 341094332d3Sopenharmony_ci do { 342094332d3Sopenharmony_ci uint64_t replyBytes = 0; 343094332d3Sopenharmony_ci size_t readSize = (remainingDataSize > bufferSize) ? (size_t)bufferSize : remainingDataSize; 344094332d3Sopenharmony_ci numRead = fread(frame, 1, readSize, g_file); 345094332d3Sopenharmony_ci if (numRead > 0) { 346094332d3Sopenharmony_ci int32_t ret = render->RenderFrame(render, (int8_t *)frame, numRead, &replyBytes); 347094332d3Sopenharmony_ci if (ret == HDF_ERR_INVALID_OBJECT) { 348094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("Render already stop!"); 349094332d3Sopenharmony_ci break; 350094332d3Sopenharmony_ci } 351094332d3Sopenharmony_ci remainingDataSize -= numRead; 352094332d3Sopenharmony_ci } 353094332d3Sopenharmony_ci 354094332d3Sopenharmony_ci while (g_waitSleep) { 355094332d3Sopenharmony_ci printf("music pause now.\n"); 356094332d3Sopenharmony_ci pthread_cond_wait(&g_functionCond, &g_mutex); 357094332d3Sopenharmony_ci printf("music resume now.\n"); 358094332d3Sopenharmony_ci } 359094332d3Sopenharmony_ci } while (!g_closeEnd && numRead > 0 && remainingDataSize > 0); 360094332d3Sopenharmony_ci 361094332d3Sopenharmony_ci if (!g_closeEnd) { 362094332d3Sopenharmony_ci printf("\nPlay complete, please select input again\n"); 363094332d3Sopenharmony_ci (void)StopAudioFiles(&render); 364094332d3Sopenharmony_ci } 365094332d3Sopenharmony_ci return HDF_SUCCESS; 366094332d3Sopenharmony_ci} 367094332d3Sopenharmony_ci 368094332d3Sopenharmony_cistatic int32_t InitPlayingAudioParam(struct IAudioRender *render) 369094332d3Sopenharmony_ci{ 370094332d3Sopenharmony_ci if (render == NULL) { 371094332d3Sopenharmony_ci return HDF_FAILURE; 372094332d3Sopenharmony_ci } 373094332d3Sopenharmony_ci uint64_t frameSize = 0; 374094332d3Sopenharmony_ci uint64_t frameCount = 0; 375094332d3Sopenharmony_ci uint64_t bufferSize = 0; 376094332d3Sopenharmony_ci if (render->GetFrameSize(render, &frameSize) != HDF_SUCCESS) { 377094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("get frame size failed"); 378094332d3Sopenharmony_ci } 379094332d3Sopenharmony_ci if (render->GetFrameCount(render, &frameCount) != HDF_SUCCESS) { 380094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("get frame count failed"); 381094332d3Sopenharmony_ci } 382094332d3Sopenharmony_ci 383094332d3Sopenharmony_ci bufferSize = frameCount * frameSize; 384094332d3Sopenharmony_ci if (bufferSize == 0) { 385094332d3Sopenharmony_ci bufferSize = PcmFramesToBytes(g_attrs); 386094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("buffer size by calc is %" PRIu64 "", bufferSize); 387094332d3Sopenharmony_ci } 388094332d3Sopenharmony_ci 389094332d3Sopenharmony_ci g_frame = (char *)OsalMemCalloc(bufferSize); 390094332d3Sopenharmony_ci if (g_frame == NULL) { 391094332d3Sopenharmony_ci return HDF_FAILURE; 392094332d3Sopenharmony_ci } 393094332d3Sopenharmony_ci 394094332d3Sopenharmony_ci (void)memset_s(&g_str, sizeof(struct StrPara), 0, sizeof(struct StrPara)); 395094332d3Sopenharmony_ci 396094332d3Sopenharmony_ci g_str.render = render; 397094332d3Sopenharmony_ci g_str.bufferSize = (int32_t)bufferSize; 398094332d3Sopenharmony_ci g_str.frame = g_frame; 399094332d3Sopenharmony_ci return HDF_SUCCESS; 400094332d3Sopenharmony_ci} 401094332d3Sopenharmony_ci 402094332d3Sopenharmony_cistatic void PrintPlayMode(void) 403094332d3Sopenharmony_ci{ 404094332d3Sopenharmony_ci printf(" ============= Play Render Mode ==========\n"); 405094332d3Sopenharmony_ci printf("| 1. Render non-mmap |\n"); 406094332d3Sopenharmony_ci printf("| 2. Render mmap |\n"); 407094332d3Sopenharmony_ci printf(" ======================================== \n"); 408094332d3Sopenharmony_ci} 409094332d3Sopenharmony_ci 410094332d3Sopenharmony_cistatic int32_t SelectPlayMode(int32_t *palyModeFlag) 411094332d3Sopenharmony_ci{ 412094332d3Sopenharmony_ci if (palyModeFlag == NULL) { 413094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("palyModeFlag is null"); 414094332d3Sopenharmony_ci return HDF_FAILURE; 415094332d3Sopenharmony_ci } 416094332d3Sopenharmony_ci 417094332d3Sopenharmony_ci int choice = 0; 418094332d3Sopenharmony_ci 419094332d3Sopenharmony_ci system("clear"); 420094332d3Sopenharmony_ci 421094332d3Sopenharmony_ci PrintPlayMode(); 422094332d3Sopenharmony_ci 423094332d3Sopenharmony_ci printf("Please enter your choice:"); 424094332d3Sopenharmony_ci 425094332d3Sopenharmony_ci int32_t ret = CheckInputName(INPUT_INT, (void *)&choice); 426094332d3Sopenharmony_ci if (ret < 0) { 427094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("CheckInputName Fail"); 428094332d3Sopenharmony_ci return HDF_FAILURE; 429094332d3Sopenharmony_ci } else { 430094332d3Sopenharmony_ci *palyModeFlag = choice; 431094332d3Sopenharmony_ci } 432094332d3Sopenharmony_ci return HDF_SUCCESS; 433094332d3Sopenharmony_ci} 434094332d3Sopenharmony_ci 435094332d3Sopenharmony_cistatic int32_t StartPlayThread(int32_t palyModeFlag) 436094332d3Sopenharmony_ci{ 437094332d3Sopenharmony_ci pthread_attr_t tidsAttr; 438094332d3Sopenharmony_ci pthread_attr_init(&tidsAttr); 439094332d3Sopenharmony_ci pthread_attr_setdetachstate(&tidsAttr, PTHREAD_CREATE_DETACHED); 440094332d3Sopenharmony_ci switch (palyModeFlag) { 441094332d3Sopenharmony_ci case 1: // 1. Stander Loading 442094332d3Sopenharmony_ci if (pthread_create(&g_tids, &tidsAttr, (void *)(&FrameStart), &g_str) != 0) { 443094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("Create Thread Fail"); 444094332d3Sopenharmony_ci return HDF_FAILURE; 445094332d3Sopenharmony_ci } 446094332d3Sopenharmony_ci break; 447094332d3Sopenharmony_ci case 2: // 2. Low latency Loading 448094332d3Sopenharmony_ci if (pthread_create(&g_tids, &tidsAttr, (void *)(&FrameStartMmap), &g_str) != 0) { 449094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("Create Thread Fail"); 450094332d3Sopenharmony_ci return HDF_FAILURE; 451094332d3Sopenharmony_ci } 452094332d3Sopenharmony_ci break; 453094332d3Sopenharmony_ci default: 454094332d3Sopenharmony_ci printf("Input error,Switched to non-mmap Mode for you.\n"); 455094332d3Sopenharmony_ci SystemInputFail(); 456094332d3Sopenharmony_ci 457094332d3Sopenharmony_ci if (pthread_create(&g_tids, &tidsAttr, (void *)(&FrameStart), &g_str) != 0) { 458094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("Create Thread Fail"); 459094332d3Sopenharmony_ci return HDF_FAILURE; 460094332d3Sopenharmony_ci } 461094332d3Sopenharmony_ci break; 462094332d3Sopenharmony_ci } 463094332d3Sopenharmony_ci return HDF_SUCCESS; 464094332d3Sopenharmony_ci} 465094332d3Sopenharmony_ci 466094332d3Sopenharmony_cistatic int32_t PlayingAudioInitFile(void) 467094332d3Sopenharmony_ci{ 468094332d3Sopenharmony_ci if (g_file != NULL) { 469094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("the music is playing,please stop first"); 470094332d3Sopenharmony_ci return HDF_FAILURE; 471094332d3Sopenharmony_ci } 472094332d3Sopenharmony_ci g_closeEnd = false; 473094332d3Sopenharmony_ci 474094332d3Sopenharmony_ci char pathBuf[PATH_MAX] = {'\0'}; 475094332d3Sopenharmony_ci if (realpath(g_path, pathBuf) == NULL) { 476094332d3Sopenharmony_ci return HDF_FAILURE; 477094332d3Sopenharmony_ci } 478094332d3Sopenharmony_ci 479094332d3Sopenharmony_ci g_file = fopen(pathBuf, "rb"); 480094332d3Sopenharmony_ci if (g_file == NULL) { 481094332d3Sopenharmony_ci printf("failed to open '%s'\n", g_path); 482094332d3Sopenharmony_ci return HDF_FAILURE; 483094332d3Sopenharmony_ci } 484094332d3Sopenharmony_ci 485094332d3Sopenharmony_ci if (CheckWavFileHeader(g_file, &g_wavHeadInfo, &g_attrs) < 0) { 486094332d3Sopenharmony_ci FileClose(&g_file); 487094332d3Sopenharmony_ci return HDF_FAILURE; 488094332d3Sopenharmony_ci } 489094332d3Sopenharmony_ci 490094332d3Sopenharmony_ci (void)chmod(g_path, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); 491094332d3Sopenharmony_ci 492094332d3Sopenharmony_ci return HDF_SUCCESS; 493094332d3Sopenharmony_ci} 494094332d3Sopenharmony_ci 495094332d3Sopenharmony_cistatic int32_t PlayingAudioInitRender(struct IAudioRender **renderTemp) 496094332d3Sopenharmony_ci{ 497094332d3Sopenharmony_ci if (renderTemp == NULL) { 498094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("render is null"); 499094332d3Sopenharmony_ci return HDF_FAILURE; 500094332d3Sopenharmony_ci } 501094332d3Sopenharmony_ci struct IAudioRender *render = NULL; 502094332d3Sopenharmony_ci if (g_adapter == NULL || g_adapter->CreateRender == NULL) { 503094332d3Sopenharmony_ci return HDF_FAILURE; 504094332d3Sopenharmony_ci } 505094332d3Sopenharmony_ci int32_t ret = g_adapter->CreateRender(g_adapter, &g_devDesc, &g_attrs, &render, &g_renderId); 506094332d3Sopenharmony_ci if (render == NULL || ret < 0 || render->RenderFrame == NULL) { 507094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("AudioDeviceCreateRender failed or RenderFrame is null"); 508094332d3Sopenharmony_ci return HDF_FAILURE; 509094332d3Sopenharmony_ci } 510094332d3Sopenharmony_ci 511094332d3Sopenharmony_ci // Playing audio files 512094332d3Sopenharmony_ci if (render->Start((void *)render)) { 513094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("Start Bind Fail!"); 514094332d3Sopenharmony_ci g_adapter->DestroyRender(g_adapter, g_renderId); 515094332d3Sopenharmony_ci IAudioRenderRelease(render, g_isDirect); 516094332d3Sopenharmony_ci return HDF_FAILURE; 517094332d3Sopenharmony_ci } 518094332d3Sopenharmony_ci 519094332d3Sopenharmony_ci if (InitPlayingAudioParam(render) < 0) { 520094332d3Sopenharmony_ci g_adapter->DestroyRender(g_adapter, g_renderId); 521094332d3Sopenharmony_ci IAudioRenderRelease(render, g_isDirect); 522094332d3Sopenharmony_ci return HDF_FAILURE; 523094332d3Sopenharmony_ci } 524094332d3Sopenharmony_ci *renderTemp = render; 525094332d3Sopenharmony_ci return HDF_SUCCESS; 526094332d3Sopenharmony_ci} 527094332d3Sopenharmony_ci 528094332d3Sopenharmony_cistatic int32_t PlayingAudioFiles(struct IAudioRender **renderS) 529094332d3Sopenharmony_ci{ 530094332d3Sopenharmony_ci if (renderS == NULL || g_adapter == NULL) { 531094332d3Sopenharmony_ci return HDF_FAILURE; 532094332d3Sopenharmony_ci } 533094332d3Sopenharmony_ci 534094332d3Sopenharmony_ci if (PlayingAudioInitFile() < 0) { 535094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("PlayingAudioInitFile Fail"); 536094332d3Sopenharmony_ci return HDF_FAILURE; 537094332d3Sopenharmony_ci } 538094332d3Sopenharmony_ci 539094332d3Sopenharmony_ci int32_t palyModeFlag = 0; 540094332d3Sopenharmony_ci if (SelectPlayMode(&palyModeFlag) < 0) { 541094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("SelectPlayMode Fail"); 542094332d3Sopenharmony_ci FileClose(&g_file); 543094332d3Sopenharmony_ci return HDF_FAILURE; 544094332d3Sopenharmony_ci } 545094332d3Sopenharmony_ci 546094332d3Sopenharmony_ci struct IAudioRender *render = NULL; 547094332d3Sopenharmony_ci if (PlayingAudioInitRender(&render) < 0) { 548094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("PlayingAudioInitRender fail"); 549094332d3Sopenharmony_ci FileClose(&g_file); 550094332d3Sopenharmony_ci return HDF_FAILURE; 551094332d3Sopenharmony_ci } 552094332d3Sopenharmony_ci 553094332d3Sopenharmony_ci if (StartPlayThread(palyModeFlag) < 0) { 554094332d3Sopenharmony_ci FileClose(&g_file); 555094332d3Sopenharmony_ci if (g_adapter != NULL && g_adapter->DestroyRender != NULL) { 556094332d3Sopenharmony_ci g_adapter->DestroyRender(g_adapter, g_renderId); 557094332d3Sopenharmony_ci } 558094332d3Sopenharmony_ci IAudioRenderRelease(render, g_isDirect); 559094332d3Sopenharmony_ci return HDF_FAILURE; 560094332d3Sopenharmony_ci } 561094332d3Sopenharmony_ci 562094332d3Sopenharmony_ci *renderS = render; 563094332d3Sopenharmony_ci printf("Start Successful,Music is playing\n"); 564094332d3Sopenharmony_ci return HDF_SUCCESS; 565094332d3Sopenharmony_ci} 566094332d3Sopenharmony_ci 567094332d3Sopenharmony_cistatic int32_t SelectLoadingMode(void) 568094332d3Sopenharmony_ci{ 569094332d3Sopenharmony_ci int choice = 0; 570094332d3Sopenharmony_ci 571094332d3Sopenharmony_ci system("clear"); 572094332d3Sopenharmony_ci 573094332d3Sopenharmony_ci PrintLoadModeMenu(); 574094332d3Sopenharmony_ci 575094332d3Sopenharmony_ci printf("Please enter your choice:"); 576094332d3Sopenharmony_ci 577094332d3Sopenharmony_ci int32_t ret = CheckInputName(INPUT_INT, (void *)&choice); 578094332d3Sopenharmony_ci if (ret < 0) { 579094332d3Sopenharmony_ci return HDF_FAILURE; 580094332d3Sopenharmony_ci } 581094332d3Sopenharmony_ci 582094332d3Sopenharmony_ci switch (choice) { 583094332d3Sopenharmony_ci case 1: // 1 is Passthrough Loading 584094332d3Sopenharmony_ci g_isDirect = true; 585094332d3Sopenharmony_ci break; 586094332d3Sopenharmony_ci case 2: // 2 is IPC Loading 587094332d3Sopenharmony_ci g_isDirect = false; 588094332d3Sopenharmony_ci break; 589094332d3Sopenharmony_ci default: 590094332d3Sopenharmony_ci printf("Input error,Switched to direct loading in for you.\n"); 591094332d3Sopenharmony_ci SystemInputFail(); 592094332d3Sopenharmony_ci g_isDirect = true; 593094332d3Sopenharmony_ci break; 594094332d3Sopenharmony_ci } 595094332d3Sopenharmony_ci 596094332d3Sopenharmony_ci return HDF_SUCCESS; 597094332d3Sopenharmony_ci} 598094332d3Sopenharmony_ci 599094332d3Sopenharmony_civoid AudioAdapterDescriptorFree(struct AudioAdapterDescriptor *dataBlock, bool freeSelf) 600094332d3Sopenharmony_ci{ 601094332d3Sopenharmony_ci if (dataBlock == NULL) { 602094332d3Sopenharmony_ci return; 603094332d3Sopenharmony_ci } 604094332d3Sopenharmony_ci 605094332d3Sopenharmony_ci if (dataBlock->adapterName != NULL) { 606094332d3Sopenharmony_ci OsalMemFree(dataBlock->adapterName); 607094332d3Sopenharmony_ci dataBlock->adapterName = NULL; 608094332d3Sopenharmony_ci } 609094332d3Sopenharmony_ci 610094332d3Sopenharmony_ci if (dataBlock->ports != NULL) { 611094332d3Sopenharmony_ci OsalMemFree(dataBlock->ports); 612094332d3Sopenharmony_ci } 613094332d3Sopenharmony_ci 614094332d3Sopenharmony_ci if (freeSelf) { 615094332d3Sopenharmony_ci OsalMemFree(dataBlock); 616094332d3Sopenharmony_ci } 617094332d3Sopenharmony_ci} 618094332d3Sopenharmony_ci 619094332d3Sopenharmony_cistatic void ReleaseAdapterDescs(struct AudioAdapterDescriptor **descs, uint32_t descsLen) 620094332d3Sopenharmony_ci{ 621094332d3Sopenharmony_ci if (descsLen > 0 && descs != NULL && (*descs) != NULL) { 622094332d3Sopenharmony_ci for (uint32_t i = 0; i < descsLen; i++) { 623094332d3Sopenharmony_ci AudioAdapterDescriptorFree(&(*descs)[i], false); 624094332d3Sopenharmony_ci } 625094332d3Sopenharmony_ci OsalMemFree(*descs); 626094332d3Sopenharmony_ci *descs = NULL; 627094332d3Sopenharmony_ci } 628094332d3Sopenharmony_ci} 629094332d3Sopenharmony_ci 630094332d3Sopenharmony_cistatic int32_t GetManagerAndLoadAdapter(struct AudioPort *renderPort) 631094332d3Sopenharmony_ci{ 632094332d3Sopenharmony_ci int32_t adapterIndex = 0; 633094332d3Sopenharmony_ci 634094332d3Sopenharmony_ci if (renderPort == NULL) { 635094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("The Parameter is NULL"); 636094332d3Sopenharmony_ci return HDF_FAILURE; 637094332d3Sopenharmony_ci } 638094332d3Sopenharmony_ci 639094332d3Sopenharmony_ci struct IAudioManager *audioManagerIns = IAudioManagerGet(g_isDirect); 640094332d3Sopenharmony_ci if (audioManagerIns == NULL) { 641094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("Get audio Manager Fail"); 642094332d3Sopenharmony_ci return HDF_FAILURE; 643094332d3Sopenharmony_ci } 644094332d3Sopenharmony_ci 645094332d3Sopenharmony_ci g_audioManager = audioManagerIns; 646094332d3Sopenharmony_ci 647094332d3Sopenharmony_ci struct AudioAdapterDescriptor *descs = (struct AudioAdapterDescriptor *)OsalMemCalloc( 648094332d3Sopenharmony_ci sizeof(struct AudioAdapterDescriptor) * (MAX_AUDIO_ADAPTER_DESC)); 649094332d3Sopenharmony_ci if (descs == NULL) { 650094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("OsalMemCalloc for descs failed"); 651094332d3Sopenharmony_ci return HDF_FAILURE; 652094332d3Sopenharmony_ci } 653094332d3Sopenharmony_ci 654094332d3Sopenharmony_ci uint32_t adapterNum = MAX_AUDIO_ADAPTER_DESC; 655094332d3Sopenharmony_ci 656094332d3Sopenharmony_ci int32_t ret = audioManagerIns->GetAllAdapters(audioManagerIns, descs, &adapterNum); 657094332d3Sopenharmony_ci if (ret < 0 || adapterNum == 0) { 658094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("Get All Adapters Fail"); 659094332d3Sopenharmony_ci ReleaseAdapterDescs(&descs, MAX_AUDIO_ADAPTER_DESC); 660094332d3Sopenharmony_ci return HDF_ERR_NOT_SUPPORT; 661094332d3Sopenharmony_ci } 662094332d3Sopenharmony_ci if (SelectAudioCard(descs, adapterNum, &adapterIndex) != HDF_SUCCESS) { 663094332d3Sopenharmony_ci ReleaseAdapterDescs(&descs, MAX_AUDIO_ADAPTER_DESC); 664094332d3Sopenharmony_ci return HDF_ERR_NOT_SUPPORT; 665094332d3Sopenharmony_ci } 666094332d3Sopenharmony_ci if (strcpy_s(g_adapterName, PATH_LEN, descs[adapterIndex - 1].adapterName) < 0) { 667094332d3Sopenharmony_ci ReleaseAdapterDescs(&descs, MAX_AUDIO_ADAPTER_DESC); 668094332d3Sopenharmony_ci return HDF_ERR_NOT_SUPPORT; 669094332d3Sopenharmony_ci } 670094332d3Sopenharmony_ci if (SwitchAudioPort(&descs[adapterIndex - 1], PORT_OUT, renderPort) != HDF_SUCCESS) { 671094332d3Sopenharmony_ci ReleaseAdapterDescs(&descs, MAX_AUDIO_ADAPTER_DESC); 672094332d3Sopenharmony_ci return HDF_ERR_NOT_SUPPORT; 673094332d3Sopenharmony_ci } 674094332d3Sopenharmony_ci if (audioManagerIns->LoadAdapter(audioManagerIns, &descs[adapterIndex - 1], &g_adapter)) { 675094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("Load Adapter Fail"); 676094332d3Sopenharmony_ci ReleaseAdapterDescs(&descs, MAX_AUDIO_ADAPTER_DESC); 677094332d3Sopenharmony_ci return HDF_ERR_NOT_SUPPORT; 678094332d3Sopenharmony_ci } 679094332d3Sopenharmony_ci 680094332d3Sopenharmony_ci ReleaseAdapterDescs(&descs, MAX_AUDIO_ADAPTER_DESC); 681094332d3Sopenharmony_ci 682094332d3Sopenharmony_ci return HDF_SUCCESS; 683094332d3Sopenharmony_ci} 684094332d3Sopenharmony_ci 685094332d3Sopenharmony_cistatic int32_t InitRenderParam(uint32_t portId) 686094332d3Sopenharmony_ci{ 687094332d3Sopenharmony_ci if (g_adapter == NULL || g_adapter->InitAllPorts == NULL) { 688094332d3Sopenharmony_ci return HDF_FAILURE; 689094332d3Sopenharmony_ci } 690094332d3Sopenharmony_ci // Initialization port information, can fill through mode and other parameters 691094332d3Sopenharmony_ci (void)g_adapter->InitAllPorts(g_adapter); 692094332d3Sopenharmony_ci 693094332d3Sopenharmony_ci // User needs to set 694094332d3Sopenharmony_ci if (InitAttrs(&g_attrs) < 0) { 695094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("InitAttrs failed"); 696094332d3Sopenharmony_ci return HDF_FAILURE; 697094332d3Sopenharmony_ci } 698094332d3Sopenharmony_ci 699094332d3Sopenharmony_ci // Specify a hardware device 700094332d3Sopenharmony_ci if (InitDevDesc(&g_devDesc, portId) < 0) { 701094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("InitDevDesc failed"); 702094332d3Sopenharmony_ci return HDF_FAILURE; 703094332d3Sopenharmony_ci } 704094332d3Sopenharmony_ci return HDF_SUCCESS; 705094332d3Sopenharmony_ci} 706094332d3Sopenharmony_ci 707094332d3Sopenharmony_cistatic int32_t RenderGetAdapterAndInitEnvParams(void) 708094332d3Sopenharmony_ci{ 709094332d3Sopenharmony_ci struct AudioPort renderPort; 710094332d3Sopenharmony_ci 711094332d3Sopenharmony_ci int32_t ret = GetManagerAndLoadAdapter(&renderPort); 712094332d3Sopenharmony_ci if (ret < 0) { 713094332d3Sopenharmony_ci return ret; 714094332d3Sopenharmony_ci } 715094332d3Sopenharmony_ci 716094332d3Sopenharmony_ci if (InitRenderParam(renderPort.portId) < 0) { 717094332d3Sopenharmony_ci g_audioManager->UnloadAdapter(g_audioManager, g_adapterName); 718094332d3Sopenharmony_ci IAudioAdapterRelease(g_adapter, g_isDirect); 719094332d3Sopenharmony_ci g_adapter = NULL; 720094332d3Sopenharmony_ci return HDF_FAILURE; 721094332d3Sopenharmony_ci } 722094332d3Sopenharmony_ci return HDF_SUCCESS; 723094332d3Sopenharmony_ci} 724094332d3Sopenharmony_ci 725094332d3Sopenharmony_cistatic int32_t InitParam(void) 726094332d3Sopenharmony_ci{ 727094332d3Sopenharmony_ci if (SelectLoadingMode() < 0) { 728094332d3Sopenharmony_ci return HDF_FAILURE; 729094332d3Sopenharmony_ci } 730094332d3Sopenharmony_ci 731094332d3Sopenharmony_ci /* Select loading mode,end */ 732094332d3Sopenharmony_ci g_audioPort.dir = PORT_OUT; 733094332d3Sopenharmony_ci g_audioPort.portId = 0; 734094332d3Sopenharmony_ci g_audioPort.portName = "AOP"; 735094332d3Sopenharmony_ci 736094332d3Sopenharmony_ci if (RenderGetAdapterAndInitEnvParams() < 0) { 737094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("GetProxyManagerFunc Fail"); 738094332d3Sopenharmony_ci if (g_audioManager != NULL) { 739094332d3Sopenharmony_ci IAudioManagerRelease(g_audioManager, g_isDirect); 740094332d3Sopenharmony_ci g_audioManager = NULL; 741094332d3Sopenharmony_ci } 742094332d3Sopenharmony_ci return HDF_FAILURE; 743094332d3Sopenharmony_ci } 744094332d3Sopenharmony_ci return HDF_SUCCESS; 745094332d3Sopenharmony_ci} 746094332d3Sopenharmony_ci 747094332d3Sopenharmony_cistatic int32_t SetRenderMute(struct IAudioRender **render) 748094332d3Sopenharmony_ci{ 749094332d3Sopenharmony_ci (void)render; 750094332d3Sopenharmony_ci if (g_render == NULL || g_render->GetMute == NULL) { 751094332d3Sopenharmony_ci return HDF_FAILURE; 752094332d3Sopenharmony_ci } 753094332d3Sopenharmony_ci 754094332d3Sopenharmony_ci int32_t val; 755094332d3Sopenharmony_ci bool isMute = false; 756094332d3Sopenharmony_ci 757094332d3Sopenharmony_ci int32_t ret = g_render->GetMute((void *)g_render, &isMute); 758094332d3Sopenharmony_ci if (ret < 0) { 759094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("The current mute state was not obtained!"); 760094332d3Sopenharmony_ci } 761094332d3Sopenharmony_ci 762094332d3Sopenharmony_ci printf("Now %s ,Do you need to set mute status(1/0):", isMute ? "mute" : "not mute"); 763094332d3Sopenharmony_ci 764094332d3Sopenharmony_ci ret = CheckInputName(INPUT_INT, (void *)&val); 765094332d3Sopenharmony_ci if (ret < 0) { 766094332d3Sopenharmony_ci return HDF_FAILURE; 767094332d3Sopenharmony_ci } 768094332d3Sopenharmony_ci 769094332d3Sopenharmony_ci if (g_render == NULL || g_render->SetMute == NULL) { 770094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("Music already stop!"); 771094332d3Sopenharmony_ci SystemInputFail(); 772094332d3Sopenharmony_ci return HDF_FAILURE; 773094332d3Sopenharmony_ci } 774094332d3Sopenharmony_ci if (val == 1) { 775094332d3Sopenharmony_ci ret = g_render->SetMute((void *)g_render, !isMute); 776094332d3Sopenharmony_ci } 777094332d3Sopenharmony_ci return ret; 778094332d3Sopenharmony_ci} 779094332d3Sopenharmony_ci 780094332d3Sopenharmony_cistatic int32_t SetRenderVolume(struct IAudioRender **render) 781094332d3Sopenharmony_ci{ 782094332d3Sopenharmony_ci (void)render; 783094332d3Sopenharmony_ci if (g_render == NULL || g_render->GetVolume == NULL) { 784094332d3Sopenharmony_ci return HDF_FAILURE; 785094332d3Sopenharmony_ci } 786094332d3Sopenharmony_ci 787094332d3Sopenharmony_ci int32_t ret; 788094332d3Sopenharmony_ci float val = 0.0; 789094332d3Sopenharmony_ci 790094332d3Sopenharmony_ci ret = g_render->GetVolume((void *)g_render, &val); 791094332d3Sopenharmony_ci if (ret < 0) { 792094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("Get current volume failed!"); 793094332d3Sopenharmony_ci SystemInputFail(); 794094332d3Sopenharmony_ci return ret; 795094332d3Sopenharmony_ci } 796094332d3Sopenharmony_ci 797094332d3Sopenharmony_ci printf("Now the volume is %f ,Please enter the volume value you want to set (0.0-1.0):", val); 798094332d3Sopenharmony_ci 799094332d3Sopenharmony_ci ret = CheckInputName(INPUT_FLOAT, (void *)&val); 800094332d3Sopenharmony_ci if (ret < 0) { 801094332d3Sopenharmony_ci return HDF_FAILURE; 802094332d3Sopenharmony_ci } 803094332d3Sopenharmony_ci 804094332d3Sopenharmony_ci if (val < 0.0 || val > 1.0) { 805094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("Invalid volume value!"); 806094332d3Sopenharmony_ci SystemInputFail(); 807094332d3Sopenharmony_ci return HDF_FAILURE; 808094332d3Sopenharmony_ci } 809094332d3Sopenharmony_ci 810094332d3Sopenharmony_ci if (g_render == NULL || g_render->SetVolume == NULL) { 811094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("Music already stop!"); 812094332d3Sopenharmony_ci SystemInputFail(); 813094332d3Sopenharmony_ci return HDF_FAILURE; 814094332d3Sopenharmony_ci } 815094332d3Sopenharmony_ci 816094332d3Sopenharmony_ci ret = g_render->SetVolume((void *)g_render, val); 817094332d3Sopenharmony_ci if (ret < 0) { 818094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("set volume fail!"); 819094332d3Sopenharmony_ci SystemInputFail(); 820094332d3Sopenharmony_ci } 821094332d3Sopenharmony_ci return ret; 822094332d3Sopenharmony_ci} 823094332d3Sopenharmony_ci 824094332d3Sopenharmony_cistatic int32_t GetRenderGain(struct IAudioRender **render) 825094332d3Sopenharmony_ci{ 826094332d3Sopenharmony_ci (void)render; 827094332d3Sopenharmony_ci if (g_render == NULL || g_render->GetGain == NULL) { 828094332d3Sopenharmony_ci return HDF_FAILURE; 829094332d3Sopenharmony_ci } 830094332d3Sopenharmony_ci 831094332d3Sopenharmony_ci float val = 1.0; 832094332d3Sopenharmony_ci 833094332d3Sopenharmony_ci int32_t ret = g_render->GetGain((void *)g_render, &val); 834094332d3Sopenharmony_ci if (ret < 0) { 835094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("Get current gain failed!"); 836094332d3Sopenharmony_ci SystemInputFail(); 837094332d3Sopenharmony_ci return HDF_FAILURE; 838094332d3Sopenharmony_ci } 839094332d3Sopenharmony_ci printf("Now the gain is %f,", val); 840094332d3Sopenharmony_ci SystemInputFail(); 841094332d3Sopenharmony_ci return HDF_SUCCESS; 842094332d3Sopenharmony_ci} 843094332d3Sopenharmony_ci 844094332d3Sopenharmony_cistatic int32_t SetRenderPause(struct IAudioRender **render) 845094332d3Sopenharmony_ci{ 846094332d3Sopenharmony_ci (void)render; 847094332d3Sopenharmony_ci 848094332d3Sopenharmony_ci if (g_waitSleep) { 849094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("Already pause,not need pause again!"); 850094332d3Sopenharmony_ci SystemInputFail(); 851094332d3Sopenharmony_ci return HDF_FAILURE; 852094332d3Sopenharmony_ci } 853094332d3Sopenharmony_ci 854094332d3Sopenharmony_ci if (g_render == NULL || g_render->Pause == NULL) { 855094332d3Sopenharmony_ci return HDF_FAILURE; 856094332d3Sopenharmony_ci } 857094332d3Sopenharmony_ci 858094332d3Sopenharmony_ci int32_t ret = g_render->Pause((void *)g_render); 859094332d3Sopenharmony_ci if (ret != 0) { 860094332d3Sopenharmony_ci return HDF_FAILURE; 861094332d3Sopenharmony_ci } 862094332d3Sopenharmony_ci 863094332d3Sopenharmony_ci printf("Pause success!\n"); 864094332d3Sopenharmony_ci g_waitSleep = true; 865094332d3Sopenharmony_ci return HDF_SUCCESS; 866094332d3Sopenharmony_ci} 867094332d3Sopenharmony_ci 868094332d3Sopenharmony_cistatic int32_t SetRenderResume(struct IAudioRender **render) 869094332d3Sopenharmony_ci{ 870094332d3Sopenharmony_ci (void)render; 871094332d3Sopenharmony_ci 872094332d3Sopenharmony_ci if (!g_waitSleep) { 873094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("Now is Playing,not need resume!"); 874094332d3Sopenharmony_ci SystemInputFail(); 875094332d3Sopenharmony_ci return HDF_FAILURE; 876094332d3Sopenharmony_ci } 877094332d3Sopenharmony_ci 878094332d3Sopenharmony_ci if (g_render == NULL || g_render->Resume == NULL) { 879094332d3Sopenharmony_ci return HDF_FAILURE; 880094332d3Sopenharmony_ci } 881094332d3Sopenharmony_ci 882094332d3Sopenharmony_ci int32_t ret = g_render->Resume((void *)g_render); 883094332d3Sopenharmony_ci if (ret != 0) { 884094332d3Sopenharmony_ci return HDF_FAILURE; 885094332d3Sopenharmony_ci } 886094332d3Sopenharmony_ci printf("resume success!\n"); 887094332d3Sopenharmony_ci 888094332d3Sopenharmony_ci pthread_mutex_lock(&g_mutex); 889094332d3Sopenharmony_ci g_waitSleep = false; 890094332d3Sopenharmony_ci pthread_cond_signal(&g_functionCond); 891094332d3Sopenharmony_ci pthread_mutex_unlock(&g_mutex); 892094332d3Sopenharmony_ci return HDF_SUCCESS; 893094332d3Sopenharmony_ci} 894094332d3Sopenharmony_cistatic void PrintAttributesFromat(void) 895094332d3Sopenharmony_ci{ 896094332d3Sopenharmony_ci printf(" ============= Render Sample Attributes Fromat =============== \n"); 897094332d3Sopenharmony_ci printf("| 1. Render AUDIO_FORMAT_TYPE_PCM_8_BIT |\n"); 898094332d3Sopenharmony_ci printf("| 2. Render AUDIO_FORMAT_TYPE_PCM_16_BIT |\n"); 899094332d3Sopenharmony_ci printf("| 3. Render AUDIO_FORMAT_TYPE_PCM_24_BIT |\n"); 900094332d3Sopenharmony_ci printf("| 4. Render AUDIO_FORMAT_TYPE_PCM_32_BIT |\n"); 901094332d3Sopenharmony_ci printf(" ============================================================= \n"); 902094332d3Sopenharmony_ci} 903094332d3Sopenharmony_cistatic int32_t SelectAttributesFomat(uint32_t *pcmFomat) 904094332d3Sopenharmony_ci{ 905094332d3Sopenharmony_ci if (pcmFomat == NULL) { 906094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("fomat is null!"); 907094332d3Sopenharmony_ci return HDF_FAILURE; 908094332d3Sopenharmony_ci } 909094332d3Sopenharmony_ci 910094332d3Sopenharmony_ci int val = 0; 911094332d3Sopenharmony_ci 912094332d3Sopenharmony_ci PrintAttributesFromat(); 913094332d3Sopenharmony_ci 914094332d3Sopenharmony_ci printf("Please select audio format,If not selected, the default is 16bit:"); 915094332d3Sopenharmony_ci 916094332d3Sopenharmony_ci int32_t ret = CheckInputName(INPUT_INT, (void *)&val); 917094332d3Sopenharmony_ci if (ret < 0) { 918094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("CheckInputName failed."); 919094332d3Sopenharmony_ci return HDF_FAILURE; 920094332d3Sopenharmony_ci } 921094332d3Sopenharmony_ci 922094332d3Sopenharmony_ci switch (val) { 923094332d3Sopenharmony_ci case AUDIO_FORMAT_TYPE_PCM_8_BIT: 924094332d3Sopenharmony_ci *pcmFomat = AUDIO_FORMAT_TYPE_PCM_8_BIT; 925094332d3Sopenharmony_ci break; 926094332d3Sopenharmony_ci case AUDIO_FORMAT_TYPE_PCM_16_BIT: 927094332d3Sopenharmony_ci *pcmFomat = AUDIO_FORMAT_TYPE_PCM_16_BIT; 928094332d3Sopenharmony_ci break; 929094332d3Sopenharmony_ci case AUDIO_FORMAT_TYPE_PCM_24_BIT: 930094332d3Sopenharmony_ci *pcmFomat = AUDIO_FORMAT_TYPE_PCM_24_BIT; 931094332d3Sopenharmony_ci break; 932094332d3Sopenharmony_ci case AUDIO_FORMAT_TYPE_PCM_32_BIT: 933094332d3Sopenharmony_ci *pcmFomat = AUDIO_FORMAT_TYPE_PCM_32_BIT; 934094332d3Sopenharmony_ci break; 935094332d3Sopenharmony_ci default: 936094332d3Sopenharmony_ci *pcmFomat = AUDIO_FORMAT_TYPE_PCM_16_BIT; 937094332d3Sopenharmony_ci break; 938094332d3Sopenharmony_ci } 939094332d3Sopenharmony_ci return HDF_SUCCESS; 940094332d3Sopenharmony_ci} 941094332d3Sopenharmony_ci 942094332d3Sopenharmony_cistatic int32_t SetRenderAttributes(struct IAudioRender **render) 943094332d3Sopenharmony_ci{ 944094332d3Sopenharmony_ci (void)render; 945094332d3Sopenharmony_ci 946094332d3Sopenharmony_ci struct AudioSampleAttributes attrs; 947094332d3Sopenharmony_ci 948094332d3Sopenharmony_ci if (g_render == NULL || g_render->GetSampleAttributes == NULL) { 949094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("The pointer is null!"); 950094332d3Sopenharmony_ci return HDF_FAILURE; 951094332d3Sopenharmony_ci } 952094332d3Sopenharmony_ci 953094332d3Sopenharmony_ci int32_t ret = g_render->GetSampleAttributes((void *)g_render, &attrs); 954094332d3Sopenharmony_ci if (ret < 0) { 955094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("GetRenderAttributes failed!"); 956094332d3Sopenharmony_ci } else { 957094332d3Sopenharmony_ci printf("Current sample attributes:\n"); 958094332d3Sopenharmony_ci printf("audioType is %u\nfomat is %u\nsampleRate is %u\nchannalCount is" 959094332d3Sopenharmony_ci "%u\nperiod is %u\nframesize is %u\nbigEndian is %u\nSignedData is %u\n", 960094332d3Sopenharmony_ci attrs.type, attrs.format, attrs.sampleRate, attrs.channelCount, attrs.period, attrs.frameSize, 961094332d3Sopenharmony_ci attrs.isBigEndian, attrs.isSignedData); 962094332d3Sopenharmony_ci } 963094332d3Sopenharmony_ci printf("Set Sample Attributes,"); 964094332d3Sopenharmony_ci SystemInputFail(); 965094332d3Sopenharmony_ci system("clear"); 966094332d3Sopenharmony_ci printf("The sample attributes you want to set,Step by step, please.\n"); 967094332d3Sopenharmony_ci 968094332d3Sopenharmony_ci ret = SelectAttributesFomat((uint32_t *)(&attrs.format)); 969094332d3Sopenharmony_ci if (ret < 0) { 970094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("SetRenderAttributes format failed!"); 971094332d3Sopenharmony_ci return HDF_FAILURE; 972094332d3Sopenharmony_ci } 973094332d3Sopenharmony_ci 974094332d3Sopenharmony_ci printf("\nPlease input sample rate(48000,44100,32000...):"); 975094332d3Sopenharmony_ci 976094332d3Sopenharmony_ci ret = CheckInputName(INPUT_UINT32, (void *)(&attrs.sampleRate)); 977094332d3Sopenharmony_ci if (ret < 0) { 978094332d3Sopenharmony_ci return HDF_FAILURE; 979094332d3Sopenharmony_ci } 980094332d3Sopenharmony_ci 981094332d3Sopenharmony_ci printf("\nPlease input bigEndian(false=0/true=1):"); 982094332d3Sopenharmony_ci 983094332d3Sopenharmony_ci ret = CheckInputName(INPUT_UINT32, (void *)(&attrs.isBigEndian)); 984094332d3Sopenharmony_ci if (ret < 0) { 985094332d3Sopenharmony_ci return HDF_FAILURE; 986094332d3Sopenharmony_ci } 987094332d3Sopenharmony_ci if (g_render == NULL || g_render->SetSampleAttributes == NULL) { 988094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("Music already complete,Please replay and set the attrbutes!"); 989094332d3Sopenharmony_ci SystemInputFail(); 990094332d3Sopenharmony_ci return HDF_FAILURE; 991094332d3Sopenharmony_ci } 992094332d3Sopenharmony_ci 993094332d3Sopenharmony_ci ret = g_render->SetSampleAttributes((void *)g_render, &attrs); 994094332d3Sopenharmony_ci if (ret < 0) { 995094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("Set render attributes failed!"); 996094332d3Sopenharmony_ci SystemInputFail(); 997094332d3Sopenharmony_ci } 998094332d3Sopenharmony_ci return ret; 999094332d3Sopenharmony_ci} 1000094332d3Sopenharmony_ci 1001094332d3Sopenharmony_cistatic int32_t PrintRenderSelectPinFirst(struct AudioSceneDescriptor *scene) 1002094332d3Sopenharmony_ci{ 1003094332d3Sopenharmony_ci system("clear"); 1004094332d3Sopenharmony_ci printf(" ==================== Select Pin ===================== \n"); 1005094332d3Sopenharmony_ci printf("| 0. Speaker |\n"); 1006094332d3Sopenharmony_ci printf("| 1. HeadPhones |\n"); 1007094332d3Sopenharmony_ci printf(" ===================================================== \n"); 1008094332d3Sopenharmony_ci 1009094332d3Sopenharmony_ci printf("Please input your choice:\n"); 1010094332d3Sopenharmony_ci int32_t val = 0; 1011094332d3Sopenharmony_ci int32_t ret = CheckInputName(INPUT_INT, (void *)&val); 1012094332d3Sopenharmony_ci if (ret < 0) { 1013094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("Invalid value!"); 1014094332d3Sopenharmony_ci SystemInputFail(); 1015094332d3Sopenharmony_ci return HDF_FAILURE; 1016094332d3Sopenharmony_ci } 1017094332d3Sopenharmony_ci 1018094332d3Sopenharmony_ci if (val == 1) { 1019094332d3Sopenharmony_ci scene->desc.pins = PIN_OUT_HEADSET; 1020094332d3Sopenharmony_ci } else { 1021094332d3Sopenharmony_ci scene->desc.pins = PIN_OUT_SPEAKER; 1022094332d3Sopenharmony_ci } 1023094332d3Sopenharmony_ci 1024094332d3Sopenharmony_ci return HDF_SUCCESS; 1025094332d3Sopenharmony_ci} 1026094332d3Sopenharmony_ci 1027094332d3Sopenharmony_cistatic int32_t PrintRenderSelectPinSecond(struct AudioSceneDescriptor *scene) 1028094332d3Sopenharmony_ci{ 1029094332d3Sopenharmony_ci system("clear"); 1030094332d3Sopenharmony_ci printf(" ==================== Select Pin ===================== \n"); 1031094332d3Sopenharmony_ci printf("| 0. Speaker |\n"); 1032094332d3Sopenharmony_ci printf("| 1. HeadPhones |\n"); 1033094332d3Sopenharmony_ci printf("| 2. Speaker and HeadPhones |\n"); 1034094332d3Sopenharmony_ci printf(" ===================================================== \n"); 1035094332d3Sopenharmony_ci 1036094332d3Sopenharmony_ci printf("Please input your choice:\n"); 1037094332d3Sopenharmony_ci int32_t val = 0; 1038094332d3Sopenharmony_ci int32_t ret = CheckInputName(INPUT_INT, (void *)&val); 1039094332d3Sopenharmony_ci if (ret < 0) { 1040094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("Invalid value!"); 1041094332d3Sopenharmony_ci SystemInputFail(); 1042094332d3Sopenharmony_ci return HDF_FAILURE; 1043094332d3Sopenharmony_ci } 1044094332d3Sopenharmony_ci 1045094332d3Sopenharmony_ci if (val == 1) { 1046094332d3Sopenharmony_ci scene->desc.pins = PIN_OUT_HEADSET; 1047094332d3Sopenharmony_ci } else if (val == 0) { 1048094332d3Sopenharmony_ci scene->desc.pins = PIN_OUT_SPEAKER; 1049094332d3Sopenharmony_ci } else { 1050094332d3Sopenharmony_ci scene->desc.pins = PIN_OUT_SPEAKER | PIN_OUT_HEADSET; 1051094332d3Sopenharmony_ci } 1052094332d3Sopenharmony_ci 1053094332d3Sopenharmony_ci return HDF_SUCCESS; 1054094332d3Sopenharmony_ci} 1055094332d3Sopenharmony_ci 1056094332d3Sopenharmony_cistatic int32_t PrintRenderSelectPinThird(struct AudioSceneDescriptor *scene) 1057094332d3Sopenharmony_ci{ 1058094332d3Sopenharmony_ci system("clear"); 1059094332d3Sopenharmony_ci printf(" ==================== Select Pin ===================== \n"); 1060094332d3Sopenharmony_ci printf("| 0. Speaker |\n"); 1061094332d3Sopenharmony_ci printf("| 1. HeadPhones |\n"); 1062094332d3Sopenharmony_ci printf(" ===================================================== \n"); 1063094332d3Sopenharmony_ci 1064094332d3Sopenharmony_ci printf("Please input your choice:\n"); 1065094332d3Sopenharmony_ci int32_t val = 0; 1066094332d3Sopenharmony_ci int32_t ret = CheckInputName(INPUT_INT, (void *)&val); 1067094332d3Sopenharmony_ci if (ret < 0) { 1068094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("Invalid value!"); 1069094332d3Sopenharmony_ci SystemInputFail(); 1070094332d3Sopenharmony_ci return HDF_FAILURE; 1071094332d3Sopenharmony_ci } 1072094332d3Sopenharmony_ci 1073094332d3Sopenharmony_ci if (val == 1) { 1074094332d3Sopenharmony_ci scene->desc.pins = PIN_OUT_HEADSET; 1075094332d3Sopenharmony_ci } else { 1076094332d3Sopenharmony_ci scene->desc.pins = PIN_OUT_SPEAKER; 1077094332d3Sopenharmony_ci } 1078094332d3Sopenharmony_ci 1079094332d3Sopenharmony_ci return HDF_SUCCESS; 1080094332d3Sopenharmony_ci} 1081094332d3Sopenharmony_ci 1082094332d3Sopenharmony_cistatic void SelectSceneMenu(void) 1083094332d3Sopenharmony_ci{ 1084094332d3Sopenharmony_ci printf(" =================== Select Scene ======================== \n"); 1085094332d3Sopenharmony_ci printf("0 is Midea. |\n"); 1086094332d3Sopenharmony_ci printf("1 is Communication. |\n"); 1087094332d3Sopenharmony_ci printf("2 is Ring-Tone. |\n"); 1088094332d3Sopenharmony_ci printf("3 is Voice-Call. |\n"); 1089094332d3Sopenharmony_ci printf("4 is Mmap. |\n"); 1090094332d3Sopenharmony_ci printf(" ========================================================= \n"); 1091094332d3Sopenharmony_ci} 1092094332d3Sopenharmony_ci 1093094332d3Sopenharmony_cistatic int32_t SelectRenderScene(struct IAudioRender **render) 1094094332d3Sopenharmony_ci{ 1095094332d3Sopenharmony_ci (void)render; 1096094332d3Sopenharmony_ci 1097094332d3Sopenharmony_ci int32_t val = 0; 1098094332d3Sopenharmony_ci struct AudioSceneDescriptor scene; 1099094332d3Sopenharmony_ci system("clear"); 1100094332d3Sopenharmony_ci SelectSceneMenu(); 1101094332d3Sopenharmony_ci printf("Please input your choice:\n"); 1102094332d3Sopenharmony_ci 1103094332d3Sopenharmony_ci int32_t ret = CheckInputName(INPUT_INT, (void *)&val); 1104094332d3Sopenharmony_ci if (ret < 0) { 1105094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("Invalid value!"); 1106094332d3Sopenharmony_ci SystemInputFail(); 1107094332d3Sopenharmony_ci return HDF_FAILURE; 1108094332d3Sopenharmony_ci } 1109094332d3Sopenharmony_ci 1110094332d3Sopenharmony_ci switch (val) { 1111094332d3Sopenharmony_ci case AUDIO_IN_MEDIA: 1112094332d3Sopenharmony_ci scene.scene.id = AUDIO_IN_MEDIA; 1113094332d3Sopenharmony_ci PrintRenderSelectPinFirst(&scene); 1114094332d3Sopenharmony_ci break; 1115094332d3Sopenharmony_ci case AUDIO_IN_COMMUNICATION: 1116094332d3Sopenharmony_ci scene.scene.id = AUDIO_IN_COMMUNICATION; 1117094332d3Sopenharmony_ci PrintRenderSelectPinSecond(&scene); 1118094332d3Sopenharmony_ci break; 1119094332d3Sopenharmony_ci case AUDIO_IN_RINGTONE: 1120094332d3Sopenharmony_ci scene.scene.id = AUDIO_IN_RINGTONE; 1121094332d3Sopenharmony_ci scene.desc.pins = PIN_OUT_SPEAKER | PIN_OUT_HEADSET; 1122094332d3Sopenharmony_ci break; 1123094332d3Sopenharmony_ci case AUDIO_IN_CALL: 1124094332d3Sopenharmony_ci scene.scene.id = AUDIO_IN_CALL; 1125094332d3Sopenharmony_ci PrintRenderSelectPinThird(&scene); 1126094332d3Sopenharmony_ci break; 1127094332d3Sopenharmony_ci case AUDIO_MMAP_NOIRQ: 1128094332d3Sopenharmony_ci scene.scene.id = AUDIO_MMAP_NOIRQ; 1129094332d3Sopenharmony_ci PrintRenderSelectPinFirst(&scene); 1130094332d3Sopenharmony_ci break; 1131094332d3Sopenharmony_ci default: 1132094332d3Sopenharmony_ci break; 1133094332d3Sopenharmony_ci } 1134094332d3Sopenharmony_ci 1135094332d3Sopenharmony_ci scene.desc.desc = "mic"; 1136094332d3Sopenharmony_ci 1137094332d3Sopenharmony_ci if (g_render == NULL || g_render->SelectScene == NULL) { 1138094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("Music already stop,"); 1139094332d3Sopenharmony_ci SystemInputFail(); 1140094332d3Sopenharmony_ci return HDF_FAILURE; 1141094332d3Sopenharmony_ci } 1142094332d3Sopenharmony_ci 1143094332d3Sopenharmony_ci ret = g_render->SelectScene((void *)g_render, &scene); 1144094332d3Sopenharmony_ci if (ret < 0) { 1145094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("Select scene fail\n"); 1146094332d3Sopenharmony_ci } 1147094332d3Sopenharmony_ci return ret; 1148094332d3Sopenharmony_ci} 1149094332d3Sopenharmony_ci 1150094332d3Sopenharmony_cistatic int32_t GetExtParams(struct IAudioRender **render) 1151094332d3Sopenharmony_ci{ 1152094332d3Sopenharmony_ci (void)render; 1153094332d3Sopenharmony_ci if (g_render == NULL || g_render->GetExtraParams == NULL) { 1154094332d3Sopenharmony_ci return HDF_FAILURE; 1155094332d3Sopenharmony_ci } 1156094332d3Sopenharmony_ci 1157094332d3Sopenharmony_ci char keyValueList[BUFFER_LEN] = {0}; 1158094332d3Sopenharmony_ci 1159094332d3Sopenharmony_ci int32_t ret = g_render->GetExtraParams((void *)g_render, keyValueList, EXT_PARAMS_MAXLEN); 1160094332d3Sopenharmony_ci if (ret < 0) { 1161094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("Get EXT params failed!"); 1162094332d3Sopenharmony_ci SystemInputFail(); 1163094332d3Sopenharmony_ci return HDF_FAILURE; 1164094332d3Sopenharmony_ci } 1165094332d3Sopenharmony_ci printf("keyValueList = %s\n", keyValueList); 1166094332d3Sopenharmony_ci return HDF_SUCCESS; 1167094332d3Sopenharmony_ci} 1168094332d3Sopenharmony_ci 1169094332d3Sopenharmony_cistatic int32_t GetRenderMmapPosition(struct IAudioRender **render) 1170094332d3Sopenharmony_ci{ 1171094332d3Sopenharmony_ci (void)render; 1172094332d3Sopenharmony_ci 1173094332d3Sopenharmony_ci if (g_render == NULL || g_render->GetMmapPosition == NULL) { 1174094332d3Sopenharmony_ci return HDF_FAILURE; 1175094332d3Sopenharmony_ci } 1176094332d3Sopenharmony_ci 1177094332d3Sopenharmony_ci uint64_t frames = 0; 1178094332d3Sopenharmony_ci struct AudioTimeStamp time; 1179094332d3Sopenharmony_ci time.tvNSec = 0; 1180094332d3Sopenharmony_ci time.tvSec = 0; 1181094332d3Sopenharmony_ci 1182094332d3Sopenharmony_ci int32_t ret = g_render->GetMmapPosition((void *)g_render, &frames, &time); 1183094332d3Sopenharmony_ci if (ret < 0) { 1184094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("Get current Mmap frames Position failed!"); 1185094332d3Sopenharmony_ci SystemInputFail(); 1186094332d3Sopenharmony_ci return HDF_FAILURE; 1187094332d3Sopenharmony_ci } 1188094332d3Sopenharmony_ci printf("Now the Position is %" PRIu64 "\n", frames); 1189094332d3Sopenharmony_ci return HDF_SUCCESS; 1190094332d3Sopenharmony_ci} 1191094332d3Sopenharmony_ci 1192094332d3Sopenharmony_cistatic void PrintMenu2(void) 1193094332d3Sopenharmony_ci{ 1194094332d3Sopenharmony_ci printf(" ================== Play Render Menu ================== \n"); 1195094332d3Sopenharmony_ci printf("| 1. Render Start |\n"); 1196094332d3Sopenharmony_ci printf("| 2. Render Stop |\n"); 1197094332d3Sopenharmony_ci printf("| 3. Render Resume |\n"); 1198094332d3Sopenharmony_ci printf("| 4. Render Pause |\n"); 1199094332d3Sopenharmony_ci printf("| 5. Render SetVolume |\n"); 1200094332d3Sopenharmony_ci printf("| 6. Render GetGain |\n"); 1201094332d3Sopenharmony_ci printf("| 7. Render SetMute |\n"); 1202094332d3Sopenharmony_ci printf("| 8. Render SetAttributes |\n"); 1203094332d3Sopenharmony_ci printf("| 9. Render SelectScene |\n"); 1204094332d3Sopenharmony_ci printf("| 10. Render getEXtParams |\n"); 1205094332d3Sopenharmony_ci printf("| 11. Render getMmapPosition |\n"); 1206094332d3Sopenharmony_ci printf("| 12.Exit |\n"); 1207094332d3Sopenharmony_ci printf(" ====================================================== \n"); 1208094332d3Sopenharmony_ci} 1209094332d3Sopenharmony_ci 1210094332d3Sopenharmony_cistatic struct ProcessRenderMenuSwitchList g_processRenderMenuSwitchList[] = { 1211094332d3Sopenharmony_ci {RENDER_START, PlayingAudioFiles }, 1212094332d3Sopenharmony_ci {RENDER_STOP, StopAudioFiles }, 1213094332d3Sopenharmony_ci {RENDER_RESUME, SetRenderResume }, 1214094332d3Sopenharmony_ci {RENDER_PAUSE, SetRenderPause }, 1215094332d3Sopenharmony_ci {SET_RENDER_VOLUME, SetRenderVolume }, 1216094332d3Sopenharmony_ci {SET_RENDER_GAIN, GetRenderGain }, 1217094332d3Sopenharmony_ci {SET_RENDER_MUTE, SetRenderMute }, 1218094332d3Sopenharmony_ci {SET_RENDER_ATTRIBUTES, SetRenderAttributes }, 1219094332d3Sopenharmony_ci {SET_RENDER_SLECET_SCENE, SelectRenderScene }, 1220094332d3Sopenharmony_ci {GET_RENDER_EXT_PARAMS, GetExtParams }, 1221094332d3Sopenharmony_ci {GET_RENDER_POSITION, GetRenderMmapPosition}, 1222094332d3Sopenharmony_ci}; 1223094332d3Sopenharmony_ci 1224094332d3Sopenharmony_cistatic void ProcessMenu(int32_t choice) 1225094332d3Sopenharmony_ci{ 1226094332d3Sopenharmony_ci if (choice == GET_RENDER_POSITION + 1) { 1227094332d3Sopenharmony_ci return; 1228094332d3Sopenharmony_ci } 1229094332d3Sopenharmony_ci 1230094332d3Sopenharmony_ci if (g_render == NULL && choice != 1) { 1231094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("This render already release!"); 1232094332d3Sopenharmony_ci SystemInputFail(); 1233094332d3Sopenharmony_ci return; 1234094332d3Sopenharmony_ci } 1235094332d3Sopenharmony_ci 1236094332d3Sopenharmony_ci for (int32_t i = RENDER_START; i <= GET_RENDER_POSITION; ++i) { 1237094332d3Sopenharmony_ci if ((choice == (int32_t)g_processRenderMenuSwitchList[i - 1].cmd) && 1238094332d3Sopenharmony_ci (g_processRenderMenuSwitchList[i - 1].operation != NULL)) { 1239094332d3Sopenharmony_ci g_processRenderMenuSwitchList[i - 1].operation(&g_render); 1240094332d3Sopenharmony_ci } 1241094332d3Sopenharmony_ci } 1242094332d3Sopenharmony_ci} 1243094332d3Sopenharmony_ci 1244094332d3Sopenharmony_cistatic void Choice(void) 1245094332d3Sopenharmony_ci{ 1246094332d3Sopenharmony_ci int32_t choice = 0; 1247094332d3Sopenharmony_ci 1248094332d3Sopenharmony_ci while (choice < GET_RENDER_POSITION + 1 && choice >= 0) { 1249094332d3Sopenharmony_ci system("clear"); 1250094332d3Sopenharmony_ci PrintMenu2(); 1251094332d3Sopenharmony_ci printf("your choice is:\n"); 1252094332d3Sopenharmony_ci 1253094332d3Sopenharmony_ci int32_t ret = CheckInputName(INPUT_INT, (void *)&choice); 1254094332d3Sopenharmony_ci if (ret < 0) { 1255094332d3Sopenharmony_ci continue; 1256094332d3Sopenharmony_ci } 1257094332d3Sopenharmony_ci 1258094332d3Sopenharmony_ci if (choice < RENDER_START || choice > GET_RENDER_POSITION + 1) { 1259094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("You input is wrong!"); 1260094332d3Sopenharmony_ci choice = 0; 1261094332d3Sopenharmony_ci SystemInputFail(); 1262094332d3Sopenharmony_ci continue; 1263094332d3Sopenharmony_ci } 1264094332d3Sopenharmony_ci ProcessMenu(choice); 1265094332d3Sopenharmony_ci } 1266094332d3Sopenharmony_ci} 1267094332d3Sopenharmony_ci 1268094332d3Sopenharmony_ciint32_t main(int32_t argc, char const *argv[]) 1269094332d3Sopenharmony_ci{ 1270094332d3Sopenharmony_ci if (argc < 2 || argv == NULL || argv[0] == NULL) { // The parameter number is not greater than 2 1271094332d3Sopenharmony_ci printf("usage:[1]sample [2]/data/test.wav\n"); 1272094332d3Sopenharmony_ci return 0; 1273094332d3Sopenharmony_ci } 1274094332d3Sopenharmony_ci 1275094332d3Sopenharmony_ci if (argv[1] == NULL || strlen(argv[1]) == 0) { 1276094332d3Sopenharmony_ci return HDF_FAILURE; 1277094332d3Sopenharmony_ci } 1278094332d3Sopenharmony_ci 1279094332d3Sopenharmony_ci int32_t ret = strncpy_s(g_path, PATH_LEN - 1, argv[1], strlen(argv[1]) + 1); 1280094332d3Sopenharmony_ci if (ret != 0) { 1281094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("strncpy_s Fail!"); 1282094332d3Sopenharmony_ci return HDF_FAILURE; 1283094332d3Sopenharmony_ci } 1284094332d3Sopenharmony_ci 1285094332d3Sopenharmony_ci char pathBuf[PATH_MAX] = {'\0'}; 1286094332d3Sopenharmony_ci if (realpath(g_path, pathBuf) == NULL) { 1287094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("realpath Fail!"); 1288094332d3Sopenharmony_ci return HDF_FAILURE; 1289094332d3Sopenharmony_ci } 1290094332d3Sopenharmony_ci 1291094332d3Sopenharmony_ci if (InitParam() != HDF_SUCCESS) { // init 1292094332d3Sopenharmony_ci AUDIO_FUNC_LOGE("InitParam Fail!"); 1293094332d3Sopenharmony_ci return HDF_FAILURE; 1294094332d3Sopenharmony_ci } 1295094332d3Sopenharmony_ci 1296094332d3Sopenharmony_ci Choice(); 1297094332d3Sopenharmony_ci 1298094332d3Sopenharmony_ci if (g_render != NULL && g_adapter != NULL) { 1299094332d3Sopenharmony_ci StopAudioFiles(&g_render); 1300094332d3Sopenharmony_ci } 1301094332d3Sopenharmony_ci 1302094332d3Sopenharmony_ci if (g_audioManager != NULL && g_audioManager->UnloadAdapter != NULL) { 1303094332d3Sopenharmony_ci g_audioManager->UnloadAdapter(g_audioManager, g_adapterName); 1304094332d3Sopenharmony_ci IAudioAdapterRelease(g_adapter, g_isDirect); 1305094332d3Sopenharmony_ci g_adapter = NULL; 1306094332d3Sopenharmony_ci IAudioManagerRelease(g_audioManager, g_isDirect); 1307094332d3Sopenharmony_ci g_audioManager = NULL; 1308094332d3Sopenharmony_ci } 1309094332d3Sopenharmony_ci return 0; 1310094332d3Sopenharmony_ci} 1311