audio_device.h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755
  1. /* Copyright (C) 2018 RDA Technologies Limited and/or its affiliates("RDA").
  2. * All rights reserved.
  3. *
  4. * This software is supplied "AS IS" without any warranties.
  5. * RDA assumes no responsibility or liability for the use of the software,
  6. * conveys no license or title under any patent, copyright, or mask work
  7. * right to the product. RDA reserves the right to make changes in the
  8. * software without notification. RDA also make no representation or
  9. * warranty that such application will be suitable for the specified use
  10. * without further testing or modification.
  11. */
  12. #ifndef _AUDIO_DEVICE_H_
  13. #define _AUDIO_DEVICE_H_
  14. #include "osi_compiler.h"
  15. #include "osi_byte_buf.h"
  16. #include "audio_types.h"
  17. #include "audio_config.h"
  18. #include "ql_api_common.h"
  19. OSI_EXTERN_C_BEGIN
  20. /**
  21. * \brief event type send from audio device for playback
  22. */
  23. typedef enum
  24. {
  25. /**
  26. * Playback is finished. This event will be sent after all samples are
  27. * output through audio device.
  28. */
  29. AUDEV_PLAY_EVENT_FINISH,
  30. } audevPlayEvent_t;
  31. /**
  32. * \brief player operations
  33. *
  34. * These operations will be called by audio device.
  35. */
  36. typedef struct
  37. {
  38. /**
  39. * \brief get audio frame
  40. *
  41. * When more data are needed, audio device will call \p get_frame
  42. * for audio frames.
  43. *
  44. * At the end of stream, callee should return empty audio frame
  45. * with \p AUFRAME_FLAG_END.
  46. *
  47. * \param param player operation context
  48. * \param frame audio frame, filled by callee
  49. * \param array get data in array
  50. * \param size empty size
  51. * \return
  52. * get data size
  53. */
  54. int (*get_frame)(void *param, auFrame_t *frame, void *address, unsigned size);
  55. /**
  56. * \brief handle play event from audio device
  57. *
  58. * \param param player operation context
  59. * \param event audio device play event
  60. */
  61. void (*handle_event)(void *param, audevPlayEvent_t event);
  62. } audevPlayOps_t;
  63. /**
  64. * \brief event type send from audio device for voice call Stop
  65. */
  66. typedef enum
  67. {
  68. /**
  69. * Record is finished. This event will be sent before voice call Stop
  70. * audio device.
  71. */
  72. AUDEV_RECORD_EVENT_FINISH,
  73. } audevRecordEvent_t;
  74. /**
  75. * \brief recorder operations
  76. *
  77. * These operations will be called by audio device.
  78. */
  79. typedef struct
  80. {
  81. /**
  82. * \brief put audio frame, shoould be processed by recorder
  83. *
  84. * \param param recorder operation contect
  85. * \param frame audio frame to be recorded
  86. * \return
  87. * - true on success
  88. * - false on error
  89. */
  90. bool (*put_frame)(void *param, const auFrame_t *frame);
  91. /**
  92. * \brief handle record event from audio device
  93. *
  94. * \param param recorder operation context
  95. * \param event audio device record event
  96. */
  97. void (*handle_event)(void *param, audevRecordEvent_t event);
  98. } audevRecordOps_t;
  99. /**
  100. * \brief function type, override keytone detect push voice data
  101. */
  102. typedef void (*ktdetectHook_t)(short *data, uint16_t SampleLen);
  103. /**
  104. * \brief initialize audio device
  105. */
  106. #ifndef CONFIG_QUEC_PROJECT_FEATURE_AUDIO
  107. void audevInit(void);
  108. #else
  109. void audevInit(uint task_prio);
  110. #endif
  111. /**
  112. * \brief reset audio device settings to default value, and clear nv
  113. */
  114. void audevResetSettings(void);
  115. /**
  116. * \brief set audio output device
  117. *
  118. * \param dev audio output device
  119. * \return
  120. * - true on success
  121. * - false on failed
  122. */
  123. bool audevSetOutput(audevOutput_t dev);
  124. /**
  125. * \brief get current audio output device
  126. *
  127. * \return
  128. * - current audio output device
  129. */
  130. audevOutput_t audevGetOutput(void);
  131. /**
  132. * \brief set audio input device
  133. *
  134. * \param dev audio input device
  135. * \return
  136. * - true on success
  137. * - false on failed
  138. */
  139. bool audevSetInput(audevInput_t dev);
  140. /**
  141. * \brief get current audio input device
  142. *
  143. * \return
  144. * - current audio input device
  145. */
  146. audevInput_t audevGetInput(void);
  147. /**
  148. * \brief set voice call volume
  149. *
  150. * \p vol should in [0, 100]. 0 is the minimal volume, and 100 is the
  151. * maximum volume.
  152. *
  153. * It is possible that the supported volume levels is not 100. And then
  154. * the output is the same for multiple \p vol.
  155. *
  156. * \param vol volume in [0, 100]
  157. * \return
  158. * - true on success
  159. * - false on invalid parameter, or failed
  160. */
  161. bool audevSetVoiceVolume(unsigned vol);
  162. /**
  163. * \brief get voice call volume
  164. *
  165. * \return
  166. * - voice call volume
  167. */
  168. unsigned audevGetVoiceVolume(void);
  169. /**
  170. * \brief set play volume
  171. *
  172. * \p vol should in [0, 100]. 0 is the minimal volume, and 100 is the
  173. * maximum volume.
  174. *
  175. * It is possible that the supported volume levels is not 100. And then
  176. * the output is the same for multiple \p vol.
  177. *
  178. * \param vol volume in [0, 100]
  179. * \return
  180. * - true on success
  181. * - false on invalid parameter, or failed
  182. */
  183. bool audevSetPlayVolume(unsigned vol);
  184. /**
  185. * \brief get play volume
  186. *
  187. * \return
  188. * - play volume
  189. */
  190. unsigned audevGetPlayVolume(void);
  191. /**
  192. * \brief mute or unmute audio output device
  193. *
  194. * This setting won't be stored nv, the initial value is always unmute.
  195. *
  196. * \param mute true for mute output
  197. * \return
  198. * - true on success
  199. * - false on invalid parameter, or failed
  200. */
  201. bool audevSetOutputMute(bool mute);
  202. /**
  203. * \brief check whether audio output device is muted
  204. *
  205. * \return
  206. * - true if audio output device is muted
  207. * - false if not
  208. */
  209. bool audevIsOutputMute(void);
  210. /**
  211. * \brief mute/unmute uplink during voice call
  212. *
  213. * When the current voice call is finished, the property will be kept.
  214. * That is, when uplink is muted for one voice call, uplink will be still
  215. * muted at the next voice call.
  216. *
  217. * This setting won't be stored nv, the initial value is always unmute.
  218. *
  219. * \param mute true for mute uplink of voice call
  220. * \return
  221. * - true on success
  222. * - false on failed
  223. */
  224. bool audevSetVoiceUplinkMute(bool mute);
  225. /**
  226. * \brief whether uplink during voice call is muted
  227. *
  228. * \return
  229. * - true if voice call uplink is muted
  230. * - false if voice call uplink is unmuted
  231. */
  232. bool audevIsVoiceUplinkMute(void);
  233. /**
  234. * \brief set record sample rate
  235. *
  236. * default value is 8000
  237. * when set value to 16000,record file format and sample rate
  238. * should be handled yourself
  239. *
  240. * \param samplerate should be 8000 or 16000.
  241. * \return
  242. * - true on success
  243. * - false on invalid parameter, or failed
  244. */
  245. bool audevSetRecordSampleRate(uint32_t samplerate);
  246. /**
  247. * \brief get record sample rate
  248. *
  249. * \return
  250. * - sample rate
  251. */
  252. uint32_t audevGetRecordSampleRate(void);
  253. /**
  254. * \brief set local record sample time interval
  255. *
  256. * default value is 20 ms
  257. * max value is 20 ms,min value is 5 ms
  258. *
  259. * \param time_ms should be 5 or 10 or 20.
  260. * \return
  261. * - true on success
  262. * - false on invalid parameter, or failed
  263. */
  264. bool audevSetRecordSampleInterval(uint8_t time_ms);
  265. /**
  266. * \brief get record sample time interval
  267. *
  268. * \return
  269. * - sample time interval
  270. */
  271. uint8_t audevGetRecordSampleInterval(void);
  272. /*
  273. *\brief Set Poc Dump mode enable
  274. *
  275. *\param en true for enable Poc Dump
  276. *
  277. *\return
  278. * - true on success
  279. * - false on invalid parameter, or failed
  280. */
  281. bool audevPocDumpEnable(bool en);
  282. /**
  283. * \brief check whether keytone detect is enabled
  284. *
  285. * \return
  286. * - true if keytone detect is enabled
  287. * - false if disabled
  288. */
  289. bool audevIsKtdetectEnable(void);
  290. /**
  291. * \brief enable or disable keytone detect function
  292. *
  293. * \param en true for enable keytone detect
  294. * \return
  295. * - true on success
  296. * - false on invalid parameter, or failed
  297. */
  298. bool audevSetKtdetectEnable(bool en);
  299. /**
  300. * \brief register hook function for keytone detect get raw voice data
  301. *
  302. * \param func the process function when ap receive raw voice data 8K mono 16bit
  303. */
  304. void audevSetKtdetectCB(ktdetectHook_t func);
  305. #ifdef CONFIG_AUDIO_IPC_SET_TRIGGER_MODE_ENABLE
  306. /**
  307. * \brief set local player Ipc trigger mode
  308. *
  309. * default mode 0,when sharemem reach empty,ipc trigger irq
  310. * customer mode 1,ipc trigger irq in every codec irq
  311. *
  312. * \param tmode should be 0 or 1.
  313. * \return
  314. * - true on success
  315. * - false on invalid parameter, or failed
  316. */
  317. bool audevSetPlayerIpcTriggerMode(uint32_t tmode);
  318. /**
  319. * \brief get player Ipc trigger mode
  320. *
  321. * \return
  322. * - tmode
  323. */
  324. uint32_t audevGetPlayerIpcTriggerMode(void);
  325. #endif
  326. /**
  327. * \brief set call mode mic gain
  328. *
  329. * \param mode should in 0,5. 0:VOICECALLNB,5:VOICECALLWB
  330. * \param path should in [0, 5]. 0:Handset,1:Handfree,2:Handset4P,3:Handset3P,4:BTHS,5:BTHSNrec
  331. * \p anaGain should in [0, 7].0:0dB,1:3dB,2:6dB,3:12dB,4:18dB,5:24dB,6:30dB,7:36dB
  332. * \p adcGain should in [0,15].0:Mute,1:-12dB,2:-10dB,...,6:-2dB,7:0dB,...,15:16dB
  333. *
  334. * \param anaGain Input analog gain
  335. * \param adcGain Input ADC gain.
  336. * \return
  337. * - true set success
  338. * - false set invalid parameter, or failed
  339. */
  340. bool audevSetMicGain(uint8_t mode, uint8_t path, uint16_t anaGain, uint16_t adcGain);
  341. /**
  342. * \brief get call mode mic gain
  343. *
  344. * \p mode should in 0,5. 0:VOICECALLNB,5:VOICECALLWB
  345. * \p path should in [0, 5]. 0:Handset,1:Handfree,2:Handset4P,3:Handset3P,4:BTHS,5:BTHSNrec
  346. * \p anaGain should in [0, 7].0:0dB,1:3dB,2:6dB,3:12dB,4:18dB,5:24dB,6:30dB,7:36dB
  347. * \p adcGain should in [0,15].0:Mute,1:-12dB,2:-10dB,...,6:-2dB,7:0dB,...,15:16dB
  348. *
  349. * \return
  350. * - anaGain ,adcGain
  351. */
  352. bool audevGetMicGain(uint8_t mode, uint8_t path, uint16_t *anaGain, uint16_t *adcGain);
  353. /**
  354. * \brief set record mode mic gain
  355. *
  356. * \param mode should in 2,4. 2:MUSICRECORD,4:FMRECORD
  357. * \param path should in [1, 3]. 1:Handfree,2:Handset4P,3:Handset3P
  358. * \param anaGain should in [0, 7].0:0dB,1:3dB,2:6dB,3:12dB,4:18dB,5:24dB,6:30dB,7:36dB
  359. * \param adcGain should in [0,15].0:Mute,1:-12dB,2:-10dB,...,6:-2dB,7:0dB,...,15:16dB
  360. * \return
  361. * - true set success
  362. * - false set invalid parameter, or failed
  363. */
  364. bool audevSetRecordMicGain(uint8_t mode, uint8_t path, uint16_t anaGain, uint16_t adcGain);
  365. /**
  366. * \brief get call mode mic gain
  367. *
  368. * \param mode should in 2,4. 2:MUSICRECORD,4:FMRECORD
  369. * \param path should in [1, 3]. 1:Handfree,2:Handset4P,3:Handset3P
  370. * \param anaGain should in [0, 7].0:0dB,1:3dB,2:6dB,3:12dB,4:18dB,5:24dB,6:30dB,7:36dB
  371. * \param adcGain should in [0,15].0:Mute,1:-12dB,2:-10dB,...,6:-2dB,7:0dB,...,15:16dB
  372. * \return
  373. * - anaGain ,adcGain
  374. */
  375. bool audevGetRecordMicGain(uint8_t mode, uint8_t path, uint16_t *anaGain, uint16_t *adcGain);
  376. /**
  377. * \brief set call mode sidetone gain
  378. *
  379. * \param mode should in 0,5. 0:VOICECALLNB,5:VOICECALLWB
  380. * \param path should in [0, 5]. 0:Handset,1:Handfree,2:Handset4P,3:Handset3P,4:BTHS,5:BTHSNrec
  381. * \param level should in [0, 15]. match with call vol0-vol15
  382. * \param sideGain should in [-39, 6].-39:mute,-36:-36dB,-33:-33dB...,-3:-3dB,0:0dB,3:3dB,6:6dB
  383. * \return
  384. * - true set success
  385. * - false set invalid parameter, or failed
  386. */
  387. bool audevSetSideToneGain(uint8_t mode, uint8_t path, int8_t sideGain);
  388. /**
  389. * \brief get call mode sidetone gain
  390. *
  391. * \param mode should in 0,5. 0:VOICECALLNB,5:VOICECALLWB
  392. * \param path should in [0, 5]. 0:Handset,1:Handfree,2:Handset4P,3:Handset3P,4:BTHS,5:BTHSNrec
  393. * \param level should in [0, 15]. match with call vol0-vol15
  394. * \param sideGain should in [-39, 6].-39:mute,-36:-36dB,-33:-33dB...,-3:-3dB,0:0dB,3:3dB,6:6dB
  395. * \return
  396. * - sideGain -39:mute,-36:-36dB,-33:-33dB...,-3:-3dB,0:0dB,3:3dB,6:6dB
  397. */
  398. bool audevGetSideToneGain(uint8_t mode, uint8_t path, int8_t *sideGain);
  399. /**
  400. * \brief start voice for call
  401. *
  402. * \return
  403. * - true on success
  404. * - false on failed
  405. */
  406. bool audevStartVoice(void);
  407. /**
  408. * \brief stop voice for call
  409. *
  410. * \return
  411. * - true on success
  412. * - false on failed
  413. */
  414. bool audevStopVoice(void);
  415. /**
  416. * \brief restart voice call
  417. *
  418. * \return
  419. * - true on success
  420. * - false on failed
  421. */
  422. bool audevRestartVoice(void);
  423. /**
  424. * \brief start voice loopback
  425. *
  426. * \return
  427. * - true on success
  428. * - false on failed
  429. */
  430. bool audevStartLoopbackVoice(audevOutput_t outdev, audevInput_t indev, unsigned volume);
  431. /**
  432. * \brief stop voice loopback
  433. *
  434. * \return
  435. * - true on success
  436. * - false on failed
  437. */
  438. bool audevStopLoopbackVoice(void);
  439. /**
  440. * switch on/off voice data dump
  441. * */
  442. void audevSetVoiceDump(bool flag);
  443. /**
  444. * \brief play a tone
  445. *
  446. * This will play a tone, and output to current audio output device.
  447. * This can't be used to send tone during voice call.
  448. *
  449. * This won't wait the specified tone duration finish, that is, it is
  450. * asynchronuous.
  451. *
  452. * Tone will be played with current output device.
  453. *
  454. * \param tone tone to be played
  455. * \param duration tone duration in milliseconds
  456. * \return
  457. * - true on success
  458. * - false on failed
  459. */
  460. bool audevPlayTone(audevTone_t tone, unsigned duration);
  461. /**
  462. * \brief stop tone play
  463. *
  464. * \return
  465. * - true on success
  466. * - false on failed
  467. */
  468. bool audevStopTone(void);
  469. /**
  470. * \brief start poc mode
  471. *
  472. * we need create a poc type audioplayer and a poc type audiorecorder before call this api
  473. * \param duplexmode true:full duplex mode record send and play recv false:half duplex mode play recv
  474. * \return
  475. * - true on success
  476. * - false on failed
  477. */
  478. bool audevStartPocMode(bool duplexmode);
  479. /**
  480. * \brief stop poc mode
  481. *
  482. * \return
  483. * - true on success
  484. * - false on failed
  485. */
  486. bool audevStopPocMode(void);
  487. /**
  488. * \brief switch poc half duplex mode
  489. *
  490. * \param mode 1:half duplex mode record send 2:half duplex mode play recv
  491. * \return
  492. * - true switch success
  493. * - false switch failed
  494. */
  495. bool audevPocModeSwitch(uint8_t mode);
  496. /**
  497. * \brief start PCM output
  498. *
  499. * Only stream information in \p frame will be used.
  500. *
  501. * \param play_ops operations will be called by audio device
  502. * \param play_ctx operation context
  503. * \param frame audio frame, only stream information will be used
  504. * \return
  505. * - true on success
  506. * - false on failed
  507. */
  508. bool audevStartPlay(const audevPlayOps_t *play_ops, void *play_ctx,
  509. const auFrame_t *frame);
  510. /**
  511. * \brief start PCM output
  512. *
  513. * Only stream information in \p frame will be used.
  514. *
  515. * \param type audio playing type
  516. * \param play_ops operations will be called by audio device
  517. * \param play_ctx operation context
  518. * \param frame audio frame, only stream information will be used
  519. * \return
  520. * - true on success
  521. * - false on failed
  522. */
  523. bool audevStartPlayV2(audevPlayType_t type, const audevPlayOps_t *play_ops, void *play_ctx,
  524. const auFrame_t *frame);
  525. /**
  526. * \brief stop PCM output
  527. *
  528. * \return
  529. * - true on success
  530. * - false on failed
  531. */
  532. bool audevStopPlay(void);
  533. /**
  534. * \brief sustainable time of audio output buffer
  535. *
  536. * There may exist multiple output buffer in the audio output pipeline.
  537. * This will estimate the sustainable time in milliseconds based on buffer
  538. * size in output buffer.
  539. *
  540. * \return
  541. * - sustainable time in milliseconds
  542. */
  543. int audevPlayRemainTime(void);
  544. /**
  545. * \brief start audio recording
  546. *
  547. * \param type audio recording type
  548. * \param rec_ops operations will called by audio device
  549. * \param rec_ctx operation context
  550. * \return
  551. * - true on success
  552. * - false on failed
  553. */
  554. bool audevStartRecord(audevRecordType_t type, const audevRecordOps_t *rec_ops, void *rec_ctx);
  555. /**
  556. * \brief stop audio recording
  557. *
  558. * \return
  559. * - true on success
  560. * - false on failed
  561. */
  562. bool audevStopRecord(void);
  563. /**
  564. * \brief restart voice call
  565. *
  566. * \return
  567. * - true on success
  568. * - false on failed
  569. */
  570. bool audevRestartVoiceRecord(void);
  571. /**
  572. * \brief start audio loopback test
  573. *
  574. * In loopback test mode, input is fedback to output.
  575. *
  576. * \param outdev output device for test mode
  577. * \param indev input device for test mode
  578. * \param volume volume
  579. * \return
  580. * - true on success
  581. * - false on failed
  582. */
  583. bool audevStartLoopbackTest(audevOutput_t outdev, audevInput_t indev, unsigned volume);
  584. /**
  585. * \brief stop audio audio loopback test
  586. *
  587. * \return
  588. * - true on success
  589. * - false on failed
  590. */
  591. bool audevStopLoopbackTest(void);
  592. /**
  593. * \brief start test mode PCM play
  594. *
  595. * This is test mode play, and should only be called for test purpose. It is
  596. * not for normal playback. In 8910, the size of \p buf must be 704.
  597. *
  598. * At return \p pcm can be freed or overwritten.
  599. *
  600. * \param outdev output device
  601. * \param buf PCM data with size
  602. * \return
  603. * - true on success
  604. * - false on failed
  605. */
  606. bool audevStartPlayTest(audevOutput_t outdev, const osiBufSize32_t *buf);
  607. /**
  608. * \brief stop test mode PCM play
  609. *
  610. * This is test mode play, and should only be called for test purpose. It is
  611. * not for normal playback.
  612. *
  613. * \return
  614. * - true on success
  615. * - false on failed
  616. */
  617. bool audevStopPlayTest(void);
  618. /**
  619. * Close mic and speaker
  620. */
  621. void audSetLdoVB(uint32_t en);
  622. /**
  623. * Get audCodec Open status
  624. */
  625. bool audIsCodecOpen(void);
  626. /**
  627. * headset plug depop
  628. */
  629. void audHeadsetdepop_en(bool en, uint8_t mictype);
  630. /**
  631. * \brief start bt voice for bt speaker
  632. *
  633. * \return
  634. * - true on success
  635. * - false on failed
  636. */
  637. bool audevBtVoiceStart(void);
  638. /**
  639. * \brief stop bt voice for bt speaker
  640. *
  641. * \return
  642. * - true on success
  643. * - false on failed
  644. */
  645. bool audevBtVoiceStop(void);
  646. /**
  647. * \brief set audio bt voice work mode
  648. *
  649. * \param workmode btworkmode
  650. * \return
  651. * - true on success
  652. * - false on failed
  653. */
  654. bool audevBtVoiceSetWorkMode(auBtVoiceWorkMode_t workmode);
  655. /**
  656. *
  657. * set BBAT mode for CP
  658. *
  659. */
  660. void audHeadSetBBATMode(uint8_t mictype, bool en);
  661. /**
  662. * \brief get current audio bt voice work mode
  663. *
  664. * \return
  665. * - current audio bt voice work mode
  666. */
  667. auBtVoiceWorkMode_t audevBtVoiceGetWorkMode(void);
  668. /**
  669. *
  670. * set BBAT mode for CP
  671. *
  672. */
  673. void audHeadSetBBATMode(uint8_t mictype, bool en);
  674. void audSetLoopbackGain(uint8_t itf, int outAlg, int outAna, int outDac, int outReserv, uint8_t inputType, int inAna, int inAdc, uint8_t *result);
  675. #if defined(CONFIG_SOC_8850) && !defined(CONFIG_AUDIO_ENABLE)
  676. void audevBMSetGpio(void);
  677. #endif
  678. #if defined(CONFIG_SOC_8850) && defined(CONFIG_AUDIO_VOICE_ENABLE)
  679. bool audevPlayVoiceTone(uint8_t ToneType, uint16_t Duration);
  680. #endif
  681. OSI_EXTERN_C_END
  682. #endif