123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755 |
- /* Copyright (C) 2018 RDA Technologies Limited and/or its affiliates("RDA").
- * All rights reserved.
- *
- * This software is supplied "AS IS" without any warranties.
- * RDA assumes no responsibility or liability for the use of the software,
- * conveys no license or title under any patent, copyright, or mask work
- * right to the product. RDA reserves the right to make changes in the
- * software without notification. RDA also make no representation or
- * warranty that such application will be suitable for the specified use
- * without further testing or modification.
- */
- #ifndef _AUDIO_DEVICE_H_
- #define _AUDIO_DEVICE_H_
- #include "osi_compiler.h"
- #include "osi_byte_buf.h"
- #include "audio_types.h"
- #include "audio_config.h"
- #include "ql_api_common.h"
- OSI_EXTERN_C_BEGIN
- /**
- * \brief event type send from audio device for playback
- */
- typedef enum
- {
- /**
- * Playback is finished. This event will be sent after all samples are
- * output through audio device.
- */
- AUDEV_PLAY_EVENT_FINISH,
- } audevPlayEvent_t;
- /**
- * \brief player operations
- *
- * These operations will be called by audio device.
- */
- typedef struct
- {
- /**
- * \brief get audio frame
- *
- * When more data are needed, audio device will call \p get_frame
- * for audio frames.
- *
- * At the end of stream, callee should return empty audio frame
- * with \p AUFRAME_FLAG_END.
- *
- * \param param player operation context
- * \param frame audio frame, filled by callee
- * \param array get data in array
- * \param size empty size
- * \return
- * get data size
- */
- int (*get_frame)(void *param, auFrame_t *frame, void *address, unsigned size);
- /**
- * \brief handle play event from audio device
- *
- * \param param player operation context
- * \param event audio device play event
- */
- void (*handle_event)(void *param, audevPlayEvent_t event);
- } audevPlayOps_t;
- /**
- * \brief event type send from audio device for voice call Stop
- */
- typedef enum
- {
- /**
- * Record is finished. This event will be sent before voice call Stop
- * audio device.
- */
- AUDEV_RECORD_EVENT_FINISH,
- } audevRecordEvent_t;
- /**
- * \brief recorder operations
- *
- * These operations will be called by audio device.
- */
- typedef struct
- {
- /**
- * \brief put audio frame, shoould be processed by recorder
- *
- * \param param recorder operation contect
- * \param frame audio frame to be recorded
- * \return
- * - true on success
- * - false on error
- */
- bool (*put_frame)(void *param, const auFrame_t *frame);
- /**
- * \brief handle record event from audio device
- *
- * \param param recorder operation context
- * \param event audio device record event
- */
- void (*handle_event)(void *param, audevRecordEvent_t event);
- } audevRecordOps_t;
- /**
- * \brief function type, override keytone detect push voice data
- */
- typedef void (*ktdetectHook_t)(short *data, uint16_t SampleLen);
- /**
- * \brief initialize audio device
- */
- #ifndef CONFIG_QUEC_PROJECT_FEATURE_AUDIO
- void audevInit(void);
- #else
- void audevInit(uint task_prio);
- #endif
- /**
- * \brief reset audio device settings to default value, and clear nv
- */
- void audevResetSettings(void);
- /**
- * \brief set audio output device
- *
- * \param dev audio output device
- * \return
- * - true on success
- * - false on failed
- */
- bool audevSetOutput(audevOutput_t dev);
- /**
- * \brief get current audio output device
- *
- * \return
- * - current audio output device
- */
- audevOutput_t audevGetOutput(void);
- /**
- * \brief set audio input device
- *
- * \param dev audio input device
- * \return
- * - true on success
- * - false on failed
- */
- bool audevSetInput(audevInput_t dev);
- /**
- * \brief get current audio input device
- *
- * \return
- * - current audio input device
- */
- audevInput_t audevGetInput(void);
- /**
- * \brief set voice call volume
- *
- * \p vol should in [0, 100]. 0 is the minimal volume, and 100 is the
- * maximum volume.
- *
- * It is possible that the supported volume levels is not 100. And then
- * the output is the same for multiple \p vol.
- *
- * \param vol volume in [0, 100]
- * \return
- * - true on success
- * - false on invalid parameter, or failed
- */
- bool audevSetVoiceVolume(unsigned vol);
- /**
- * \brief get voice call volume
- *
- * \return
- * - voice call volume
- */
- unsigned audevGetVoiceVolume(void);
- /**
- * \brief set play volume
- *
- * \p vol should in [0, 100]. 0 is the minimal volume, and 100 is the
- * maximum volume.
- *
- * It is possible that the supported volume levels is not 100. And then
- * the output is the same for multiple \p vol.
- *
- * \param vol volume in [0, 100]
- * \return
- * - true on success
- * - false on invalid parameter, or failed
- */
- bool audevSetPlayVolume(unsigned vol);
- /**
- * \brief get play volume
- *
- * \return
- * - play volume
- */
- unsigned audevGetPlayVolume(void);
- /**
- * \brief mute or unmute audio output device
- *
- * This setting won't be stored nv, the initial value is always unmute.
- *
- * \param mute true for mute output
- * \return
- * - true on success
- * - false on invalid parameter, or failed
- */
- bool audevSetOutputMute(bool mute);
- /**
- * \brief check whether audio output device is muted
- *
- * \return
- * - true if audio output device is muted
- * - false if not
- */
- bool audevIsOutputMute(void);
- /**
- * \brief mute/unmute uplink during voice call
- *
- * When the current voice call is finished, the property will be kept.
- * That is, when uplink is muted for one voice call, uplink will be still
- * muted at the next voice call.
- *
- * This setting won't be stored nv, the initial value is always unmute.
- *
- * \param mute true for mute uplink of voice call
- * \return
- * - true on success
- * - false on failed
- */
- bool audevSetVoiceUplinkMute(bool mute);
- /**
- * \brief whether uplink during voice call is muted
- *
- * \return
- * - true if voice call uplink is muted
- * - false if voice call uplink is unmuted
- */
- bool audevIsVoiceUplinkMute(void);
- /**
- * \brief set record sample rate
- *
- * default value is 8000
- * when set value to 16000,record file format and sample rate
- * should be handled yourself
- *
- * \param samplerate should be 8000 or 16000.
- * \return
- * - true on success
- * - false on invalid parameter, or failed
- */
- bool audevSetRecordSampleRate(uint32_t samplerate);
- /**
- * \brief get record sample rate
- *
- * \return
- * - sample rate
- */
- uint32_t audevGetRecordSampleRate(void);
- /**
- * \brief set local record sample time interval
- *
- * default value is 20 ms
- * max value is 20 ms,min value is 5 ms
- *
- * \param time_ms should be 5 or 10 or 20.
- * \return
- * - true on success
- * - false on invalid parameter, or failed
- */
- bool audevSetRecordSampleInterval(uint8_t time_ms);
- /**
- * \brief get record sample time interval
- *
- * \return
- * - sample time interval
- */
- uint8_t audevGetRecordSampleInterval(void);
- /*
- *\brief Set Poc Dump mode enable
- *
- *\param en true for enable Poc Dump
- *
- *\return
- * - true on success
- * - false on invalid parameter, or failed
- */
- bool audevPocDumpEnable(bool en);
- /**
- * \brief check whether keytone detect is enabled
- *
- * \return
- * - true if keytone detect is enabled
- * - false if disabled
- */
- bool audevIsKtdetectEnable(void);
- /**
- * \brief enable or disable keytone detect function
- *
- * \param en true for enable keytone detect
- * \return
- * - true on success
- * - false on invalid parameter, or failed
- */
- bool audevSetKtdetectEnable(bool en);
- /**
- * \brief register hook function for keytone detect get raw voice data
- *
- * \param func the process function when ap receive raw voice data 8K mono 16bit
- */
- void audevSetKtdetectCB(ktdetectHook_t func);
- #ifdef CONFIG_AUDIO_IPC_SET_TRIGGER_MODE_ENABLE
- /**
- * \brief set local player Ipc trigger mode
- *
- * default mode 0,when sharemem reach empty,ipc trigger irq
- * customer mode 1,ipc trigger irq in every codec irq
- *
- * \param tmode should be 0 or 1.
- * \return
- * - true on success
- * - false on invalid parameter, or failed
- */
- bool audevSetPlayerIpcTriggerMode(uint32_t tmode);
- /**
- * \brief get player Ipc trigger mode
- *
- * \return
- * - tmode
- */
- uint32_t audevGetPlayerIpcTriggerMode(void);
- #endif
- /**
- * \brief set call mode mic gain
- *
- * \param mode should in 0,5. 0:VOICECALLNB,5:VOICECALLWB
- * \param path should in [0, 5]. 0:Handset,1:Handfree,2:Handset4P,3:Handset3P,4:BTHS,5:BTHSNrec
- * \p anaGain should in [0, 7].0:0dB,1:3dB,2:6dB,3:12dB,4:18dB,5:24dB,6:30dB,7:36dB
- * \p adcGain should in [0,15].0:Mute,1:-12dB,2:-10dB,...,6:-2dB,7:0dB,...,15:16dB
- *
- * \param anaGain Input analog gain
- * \param adcGain Input ADC gain.
- * \return
- * - true set success
- * - false set invalid parameter, or failed
- */
- bool audevSetMicGain(uint8_t mode, uint8_t path, uint16_t anaGain, uint16_t adcGain);
- /**
- * \brief get call mode mic gain
- *
- * \p mode should in 0,5. 0:VOICECALLNB,5:VOICECALLWB
- * \p path should in [0, 5]. 0:Handset,1:Handfree,2:Handset4P,3:Handset3P,4:BTHS,5:BTHSNrec
- * \p anaGain should in [0, 7].0:0dB,1:3dB,2:6dB,3:12dB,4:18dB,5:24dB,6:30dB,7:36dB
- * \p adcGain should in [0,15].0:Mute,1:-12dB,2:-10dB,...,6:-2dB,7:0dB,...,15:16dB
- *
- * \return
- * - anaGain ,adcGain
- */
- bool audevGetMicGain(uint8_t mode, uint8_t path, uint16_t *anaGain, uint16_t *adcGain);
- /**
- * \brief set record mode mic gain
- *
- * \param mode should in 2,4. 2:MUSICRECORD,4:FMRECORD
- * \param path should in [1, 3]. 1:Handfree,2:Handset4P,3:Handset3P
- * \param anaGain should in [0, 7].0:0dB,1:3dB,2:6dB,3:12dB,4:18dB,5:24dB,6:30dB,7:36dB
- * \param adcGain should in [0,15].0:Mute,1:-12dB,2:-10dB,...,6:-2dB,7:0dB,...,15:16dB
- * \return
- * - true set success
- * - false set invalid parameter, or failed
- */
- bool audevSetRecordMicGain(uint8_t mode, uint8_t path, uint16_t anaGain, uint16_t adcGain);
- /**
- * \brief get call mode mic gain
- *
- * \param mode should in 2,4. 2:MUSICRECORD,4:FMRECORD
- * \param path should in [1, 3]. 1:Handfree,2:Handset4P,3:Handset3P
- * \param anaGain should in [0, 7].0:0dB,1:3dB,2:6dB,3:12dB,4:18dB,5:24dB,6:30dB,7:36dB
- * \param adcGain should in [0,15].0:Mute,1:-12dB,2:-10dB,...,6:-2dB,7:0dB,...,15:16dB
- * \return
- * - anaGain ,adcGain
- */
- bool audevGetRecordMicGain(uint8_t mode, uint8_t path, uint16_t *anaGain, uint16_t *adcGain);
- /**
- * \brief set call mode sidetone gain
- *
- * \param mode should in 0,5. 0:VOICECALLNB,5:VOICECALLWB
- * \param path should in [0, 5]. 0:Handset,1:Handfree,2:Handset4P,3:Handset3P,4:BTHS,5:BTHSNrec
- * \param level should in [0, 15]. match with call vol0-vol15
- * \param sideGain should in [-39, 6].-39:mute,-36:-36dB,-33:-33dB...,-3:-3dB,0:0dB,3:3dB,6:6dB
- * \return
- * - true set success
- * - false set invalid parameter, or failed
- */
- bool audevSetSideToneGain(uint8_t mode, uint8_t path, int8_t sideGain);
- /**
- * \brief get call mode sidetone gain
- *
- * \param mode should in 0,5. 0:VOICECALLNB,5:VOICECALLWB
- * \param path should in [0, 5]. 0:Handset,1:Handfree,2:Handset4P,3:Handset3P,4:BTHS,5:BTHSNrec
- * \param level should in [0, 15]. match with call vol0-vol15
- * \param sideGain should in [-39, 6].-39:mute,-36:-36dB,-33:-33dB...,-3:-3dB,0:0dB,3:3dB,6:6dB
- * \return
- * - sideGain -39:mute,-36:-36dB,-33:-33dB...,-3:-3dB,0:0dB,3:3dB,6:6dB
- */
- bool audevGetSideToneGain(uint8_t mode, uint8_t path, int8_t *sideGain);
- /**
- * \brief start voice for call
- *
- * \return
- * - true on success
- * - false on failed
- */
- bool audevStartVoice(void);
- /**
- * \brief stop voice for call
- *
- * \return
- * - true on success
- * - false on failed
- */
- bool audevStopVoice(void);
- /**
- * \brief restart voice call
- *
- * \return
- * - true on success
- * - false on failed
- */
- bool audevRestartVoice(void);
- /**
- * \brief start voice loopback
- *
- * \return
- * - true on success
- * - false on failed
- */
- bool audevStartLoopbackVoice(audevOutput_t outdev, audevInput_t indev, unsigned volume);
- /**
- * \brief stop voice loopback
- *
- * \return
- * - true on success
- * - false on failed
- */
- bool audevStopLoopbackVoice(void);
- /**
- * switch on/off voice data dump
- * */
- void audevSetVoiceDump(bool flag);
- /**
- * \brief play a tone
- *
- * This will play a tone, and output to current audio output device.
- * This can't be used to send tone during voice call.
- *
- * This won't wait the specified tone duration finish, that is, it is
- * asynchronuous.
- *
- * Tone will be played with current output device.
- *
- * \param tone tone to be played
- * \param duration tone duration in milliseconds
- * \return
- * - true on success
- * - false on failed
- */
- bool audevPlayTone(audevTone_t tone, unsigned duration);
- /**
- * \brief stop tone play
- *
- * \return
- * - true on success
- * - false on failed
- */
- bool audevStopTone(void);
- /**
- * \brief start poc mode
- *
- * we need create a poc type audioplayer and a poc type audiorecorder before call this api
- * \param duplexmode true:full duplex mode record send and play recv false:half duplex mode play recv
- * \return
- * - true on success
- * - false on failed
- */
- bool audevStartPocMode(bool duplexmode);
- /**
- * \brief stop poc mode
- *
- * \return
- * - true on success
- * - false on failed
- */
- bool audevStopPocMode(void);
- /**
- * \brief switch poc half duplex mode
- *
- * \param mode 1:half duplex mode record send 2:half duplex mode play recv
- * \return
- * - true switch success
- * - false switch failed
- */
- bool audevPocModeSwitch(uint8_t mode);
- /**
- * \brief start PCM output
- *
- * Only stream information in \p frame will be used.
- *
- * \param play_ops operations will be called by audio device
- * \param play_ctx operation context
- * \param frame audio frame, only stream information will be used
- * \return
- * - true on success
- * - false on failed
- */
- bool audevStartPlay(const audevPlayOps_t *play_ops, void *play_ctx,
- const auFrame_t *frame);
- /**
- * \brief start PCM output
- *
- * Only stream information in \p frame will be used.
- *
- * \param type audio playing type
- * \param play_ops operations will be called by audio device
- * \param play_ctx operation context
- * \param frame audio frame, only stream information will be used
- * \return
- * - true on success
- * - false on failed
- */
- bool audevStartPlayV2(audevPlayType_t type, const audevPlayOps_t *play_ops, void *play_ctx,
- const auFrame_t *frame);
- /**
- * \brief stop PCM output
- *
- * \return
- * - true on success
- * - false on failed
- */
- bool audevStopPlay(void);
- /**
- * \brief sustainable time of audio output buffer
- *
- * There may exist multiple output buffer in the audio output pipeline.
- * This will estimate the sustainable time in milliseconds based on buffer
- * size in output buffer.
- *
- * \return
- * - sustainable time in milliseconds
- */
- int audevPlayRemainTime(void);
- /**
- * \brief start audio recording
- *
- * \param type audio recording type
- * \param rec_ops operations will called by audio device
- * \param rec_ctx operation context
- * \return
- * - true on success
- * - false on failed
- */
- bool audevStartRecord(audevRecordType_t type, const audevRecordOps_t *rec_ops, void *rec_ctx);
- /**
- * \brief stop audio recording
- *
- * \return
- * - true on success
- * - false on failed
- */
- bool audevStopRecord(void);
- /**
- * \brief restart voice call
- *
- * \return
- * - true on success
- * - false on failed
- */
- bool audevRestartVoiceRecord(void);
- /**
- * \brief start audio loopback test
- *
- * In loopback test mode, input is fedback to output.
- *
- * \param outdev output device for test mode
- * \param indev input device for test mode
- * \param volume volume
- * \return
- * - true on success
- * - false on failed
- */
- bool audevStartLoopbackTest(audevOutput_t outdev, audevInput_t indev, unsigned volume);
- /**
- * \brief stop audio audio loopback test
- *
- * \return
- * - true on success
- * - false on failed
- */
- bool audevStopLoopbackTest(void);
- /**
- * \brief start test mode PCM play
- *
- * This is test mode play, and should only be called for test purpose. It is
- * not for normal playback. In 8910, the size of \p buf must be 704.
- *
- * At return \p pcm can be freed or overwritten.
- *
- * \param outdev output device
- * \param buf PCM data with size
- * \return
- * - true on success
- * - false on failed
- */
- bool audevStartPlayTest(audevOutput_t outdev, const osiBufSize32_t *buf);
- /**
- * \brief stop test mode PCM play
- *
- * This is test mode play, and should only be called for test purpose. It is
- * not for normal playback.
- *
- * \return
- * - true on success
- * - false on failed
- */
- bool audevStopPlayTest(void);
- /**
- * Close mic and speaker
- */
- void audSetLdoVB(uint32_t en);
- /**
- * Get audCodec Open status
- */
- bool audIsCodecOpen(void);
- /**
- * headset plug depop
- */
- void audHeadsetdepop_en(bool en, uint8_t mictype);
- /**
- * \brief start bt voice for bt speaker
- *
- * \return
- * - true on success
- * - false on failed
- */
- bool audevBtVoiceStart(void);
- /**
- * \brief stop bt voice for bt speaker
- *
- * \return
- * - true on success
- * - false on failed
- */
- bool audevBtVoiceStop(void);
- /**
- * \brief set audio bt voice work mode
- *
- * \param workmode btworkmode
- * \return
- * - true on success
- * - false on failed
- */
- bool audevBtVoiceSetWorkMode(auBtVoiceWorkMode_t workmode);
- /**
- *
- * set BBAT mode for CP
- *
- */
- void audHeadSetBBATMode(uint8_t mictype, bool en);
- /**
- * \brief get current audio bt voice work mode
- *
- * \return
- * - current audio bt voice work mode
- */
- auBtVoiceWorkMode_t audevBtVoiceGetWorkMode(void);
- /**
- *
- * set BBAT mode for CP
- *
- */
- void audHeadSetBBATMode(uint8_t mictype, bool en);
- void audSetLoopbackGain(uint8_t itf, int outAlg, int outAna, int outDac, int outReserv, uint8_t inputType, int inAna, int inAdc, uint8_t *result);
- #if defined(CONFIG_SOC_8850) && !defined(CONFIG_AUDIO_ENABLE)
- void audevBMSetGpio(void);
- #endif
- #if defined(CONFIG_SOC_8850) && defined(CONFIG_AUDIO_VOICE_ENABLE)
- bool audevPlayVoiceTone(uint8_t ToneType, uint16_t Duration);
- #endif
- OSI_EXTERN_C_END
- #endif
|