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