blob: 588098e4392edcab68a7d10987fafc771fd4d5ed [file] [log] [blame]
rjw6c1fd8f2022-11-30 14:33:01 +08001/*****************************************************************************
2* Copyright Statement:
3* --------------------
4* This software is protected by Copyright and the information contained
5* herein is confidential. The software may not be copied and the information
6* contained herein may not be used or disclosed except with the written
7* permission of MediaTek Inc. (C) 2005
8*
9* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
10* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
11* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
12* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
13* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
14* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
15* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
16* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
17* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
18* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
19* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
20* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
21*
22* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
23* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
24* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
25* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
26* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
27*
28* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
29* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
30* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
31* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
32* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
33*
34*****************************************************************************/
35
36/*******************************************************************************
37 *
38 * Filename:
39 * ---------
40 * DTMF_drv.c
41 *
42 * Project:
43 * --------
44 * MAUI
45 *
46 * Description:
47 * ------------
48 * ARM DTMF driver
49 *
50 * Author:
51 * -------
52 * -------
53 *
54 *==============================================================================
55 * HISTORY
56 * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
57 *------------------------------------------------------------------------------
58 * removed!
59 * removed!
60 * removed!
61 *
62 * removed!
63 * removed!
64 * removed!
65 *
66 * removed!
67 * removed!
68 * removed!
69 *
70 * removed!
71 * removed!
72 * removed!
73 *
74 * removed!
75 * removed!
76 * removed!
77 *
78 * removed!
79 * removed!
80 * removed!
81 *
82 * removed!
83 * removed!
84 * removed!
85 * removed!
86 *
87 * removed!
88 * removed!
89 * removed!
90 *
91 * removed!
92 * removed!
93 * removed!
94 *
95 * removed!
96 * removed!
97 * removed!
98 * removed!
99 * removed!
100 * removed!
101 * removed!
102 * removed!
103 * removed!
104 * removed!
105 * removed!
106 *------------------------------------------------------------------------------
107 * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
108 *==============================================================================
109*******************************************************************************/
110
111#include "kal_public_api.h"
112#include "kal_trace.h"
113#include "l1audio.h"
114// #include "audio_def.h"
115#include "l1sp_trc.h"
116#include "am.h"
117//#include "med_utility.h"
118#include "l1audio_trace_utmd.h"
119#include "media.h"
120#include "tone_drv.h"
121
122
123
124#if defined(__MCU_DTMF_SUPPORT__) //&& !defined( MED_MODEM )
125
126//#include "pcmsink.h"
127#include "dtmf_exp.h"
128
129#define DTMF_MAX_DURATION (0xFFFFFFFF)
130//#define DTMF_DEFALUT_SAMPLE_RATE (16000)
131#define DTMF_DEFALUT_SAMPLE_RATE (32000)
132#define DTMF_BUFFERED_FRAME_NUMBER (4)
133#define DTMF_MAX_FRAME (0xFFFF)
134#define DTMF_MIN_FRAME (3) // 5 * 20 msec
135#define DTMF_FRAME_LEN (20) // 20 msec
136#define DTMF_STOP_WAIT_TICK (80)//((DTMF_FRAME_LEN*DTMF_BUFFERED_FRAME_NUMBER+2)/4)
137//#define DTMF_FLUSH_FRAME_NUMBER ((PCM_SOUND_FILLDATA_THRESHOLD/DTMF_FRAME_LEN)+1)
138//#pragma arm section code="SECONDARY_ROCODE"
139
140static kal_uint32 DTMF_FLUSH_FRAME_NUMBER = 3;
141//static kal_uint32 uDtmfMuteLength1 = 6;
142//static kal_uint32 uDtmfMuteLength2 = 0;//13;
143//static kal_uint32 uDtmfMuteLength3 = 1;
144//static kal_uint32 uDtmfMuteLength4 = 3;
145//static kal_uint32 uMuteLength = 150;//60;
146static kal_uint32 uPreSilenceLength= 3;
147kal_enhmutexid MCUTONEMUTEXID;
148kal_spinlockid MCUTONESpinLockID;
149
150static struct {
151 const L1SP_QTMF *pCurrQTMF;
152 const L1SP_Tones *pToneList;
153 void *pHandle;
154
155 kal_uint32 uRemainDuration[3];
156 kal_uint32 uTotalDuration[3];
157 kal_bool fIsQTMF[3];
158 kal_bool fIsOn[3];
159 kal_bool fEnable[3];
160
161 //buffer
162 AUD_RB_INFO RingBuffer;
163 kal_uint32 uFrameByte;
164
165 //Current Tone
166 kal_bool fNewDTMF;
167 kal_bool fClearDTMF;
168 kal_bool fIsToneListQTMF;
169 kal_bool fEnding;
170
171 kal_uint16 uAudId;
172 kal_uint16 uSampleRate;
173 kal_uint8 uCurIdx;
174
175 kal_bool fIsKeytonePlaying;
176 kal_bool fIsTonePlaying;
177 kal_uint8 uFlushSilenceCount;
178 kal_bool fForceStop;
179}DTMF_SW;
180
181
182
183
184
185
186static kal_uint32 dtmf_mcu_CheckDuration(kal_uint16 uDuration)
187{
188 if(uDuration)
189 {
190 return ((uDuration+DTMF_FRAME_LEN-1)/DTMF_FRAME_LEN);
191
192 }
193
194 return DTMF_MAX_DURATION;
195
196}
197
198static kal_bool dtmf_mcu_IsPlaying()
199{
200 if( DTMF_SW.fEnable[0] || DTMF_SW.fEnable[1] || DTMF_SW.fEnable[2] )
201 {
202 return KAL_TRUE;
203 }
204 return KAL_FALSE;
205}
206
207static void dtmf_mcu_GetKeyID(kal_uint32 uIndex, DTMF_KEY *uKey1, DTMF_KEY *uKey2 )
208{
209 ASSERT(uIndex<3);
210 if(uIndex==0)
211 {
212 *uKey1 = DTMFKEY_Ext0;
213 *uKey2 = DTMFKEY_Ext1;
214 }
215 else if(uIndex==1)
216 {
217 *uKey1 = DTMFKEY_Ext2;
218 *uKey2 = DTMFKEY_Ext3;
219 }
220 else if(uIndex==2)
221 {
222 *uKey1 = DTMFKEY_Ext4;
223 *uKey2 = DTMFKEY_Ext5;
224 }
225}
226
227static void dtmf_mcu_GetPreIndex(kal_uint32 uCurIndex, kal_uint32 *uPreIndex1, kal_uint32 *uPreIndex2 )
228{
229 ASSERT(uCurIndex<3);
230 if(uCurIndex==0)
231 {
232 *uPreIndex1 = 2;
233 *uPreIndex2 = 1;
234 }
235 else if(uCurIndex==1)
236 {
237 *uPreIndex1 = 0;
238 *uPreIndex2 = 2;
239 }
240 else
241 {
242 *uPreIndex1 = 1;
243 *uPreIndex2 = 0;
244 }
245}
246
247static void dtmf_mcu_DeActivatAllKey()
248{
249 kal_uint32 I = 0;
250 for(I=0;I<3;I++)
251 {
252 if(DTMF_SW.fEnable[I])
253 {
254 if(DTMF_SW.fIsOn[I] == KAL_FALSE)
255 {
256 DTMF_SW.fEnable[I] = KAL_FALSE;
257 }
258 DTMF_SW.uRemainDuration[I] = 1;
259 }
260 }
261}
262
263static void dtmf_mcu_ActivatNewKey()
264{
265 DTMF_KEY uKey1, uKey2;
266 kal_uint32 uPreIndex1, uPreIndex2;
267 kal_uint32 uCurrentDur;
268 DTMF_SW.uCurIdx++;
269 if(DTMF_SW.uCurIdx > 2)
270 {
271 DTMF_SW.uCurIdx = 0;
272 }
273 dtmf_mcu_GetPreIndex(DTMF_SW.uCurIdx, &uPreIndex1, &uPreIndex2);
274 dtmf_mcu_GetKeyID(DTMF_SW.uCurIdx, &uKey1, &uKey2);
275 DTMF_SetKey( DTMF_SW.pHandle, uKey1, (kal_int32)DTMF_SW.pCurrQTMF->freq1, (kal_int32)DTMF_SW.pCurrQTMF->freq2);
276 DTMF_SetKey( DTMF_SW.pHandle, uKey2, (kal_int32)DTMF_SW.pCurrQTMF->freq3, (kal_int32)DTMF_SW.pCurrQTMF->freq4);
277 uCurrentDur = dtmf_mcu_CheckDuration(DTMF_SW.pCurrQTMF->on_duration);
278 DTMF_SW.uRemainDuration[DTMF_SW.uCurIdx] = DTMF_SW.uTotalDuration[DTMF_SW.uCurIdx] = uCurrentDur;
279 DTMF_SW.fIsQTMF[DTMF_SW.uCurIdx] = DTMF_SW.fIsToneListQTMF;
280 DTMF_SW.fEnable[DTMF_SW.uCurIdx] = KAL_TRUE;
281 DTMF_SW.fIsOn[DTMF_SW.uCurIdx] = KAL_TRUE;
282 if(DTMF_SW.fEnable[uPreIndex2])
283 {
284 MD_TRC_MCU_DTMF_NEWKEY_FORCE_END_2(uPreIndex2, DTMF_SW.uRemainDuration[uPreIndex2], DTMF_SW.uTotalDuration[uPreIndex2]);
285 DTMF_SW.uRemainDuration[uPreIndex2] = 1;
286 }
287 if(DTMF_SW.fEnable[uPreIndex1])
288 {
289 MD_TRC_MCU_DTMF_NEWKEY_FORCE_END_1(uPreIndex1, DTMF_SW.uRemainDuration[uPreIndex1], DTMF_SW.uTotalDuration[uPreIndex1]);
290 if(DTMF_SW.uTotalDuration[uPreIndex1] > DTMF_MIN_FRAME)
291 {
292 kal_uint32 uPlayedDur = DTMF_SW.uTotalDuration[uPreIndex1]-DTMF_SW.uRemainDuration[uPreIndex1];
293 if(uPlayedDur >= DTMF_MIN_FRAME )
294 {
295 DTMF_SW.uRemainDuration[uPreIndex1] = 1;
296 }
297 else
298 {
299 DTMF_SW.uRemainDuration[uPreIndex1] = DTMF_MIN_FRAME - uPlayedDur;
300 }
301 }
302 if(DTMF_SW.uRemainDuration[uPreIndex1] > uCurrentDur)
303 {
304 DTMF_SW.uRemainDuration[uPreIndex1] = uCurrentDur;
305 }
306 }
307 MD_TRC_MCU_DTMF_NEWKEY(DTMF_SW.uCurIdx, uCurrentDur, DTMF_SW.fIsToneListQTMF, DTMF_SW.pCurrQTMF->freq1, DTMF_SW.pCurrQTMF->freq2, DTMF_SW.pCurrQTMF->freq3, DTMF_SW.pCurrQTMF->freq4);
308}
309
310static void dtmf_mcu_PrepareTone(kal_uint32 uIndex)
311{
312 DTMF_KEY uKey1, uKey2;
313 if(!DTMF_SW.fEnable[uIndex])
314 {
315 return;
316 }
317 dtmf_mcu_GetKeyID(uIndex, &uKey1, &uKey2);
318 if(DTMF_SW.uRemainDuration[uIndex] == DTMF_SW.uTotalDuration[uIndex])
319 {
320 if(DTMF_SW.fIsOn[uIndex] == KAL_FALSE)
321 {
322 DTMF_Tone(DTMF_SW.pHandle, uKey1, 0);
323 DTMF_Tone(DTMF_SW.pHandle, uKey2, 0);
324 }
325 else if(DTMF_SW.fIsQTMF[uIndex])
326 {
327 DTMF_Tone(DTMF_SW.pHandle, uKey1, 1);
328 DTMF_Tone(DTMF_SW.pHandle, uKey2, 1);
329 }
330 else
331 {
332 DTMF_Tone(DTMF_SW.pHandle, uKey1, 1);
333 DTMF_Tone(DTMF_SW.pHandle, uKey2, 0);
334 }
335 }
336 else if(DTMF_SW.uRemainDuration[uIndex] == 1)
337 {
338 DTMF_Tone(DTMF_SW.pHandle, uKey1, 0);
339 DTMF_Tone(DTMF_SW.pHandle, uKey2, 0);
340 }
341}
342
343static void dtmf_mcu_UpdateTone(kal_uint32 uIndex)
344{
345 DTMF_KEY uKey1, uKey2;
346 if(!DTMF_SW.fEnable[uIndex])
347 {
348 return;
349 }
350 dtmf_mcu_GetKeyID(uIndex, &uKey1, &uKey2);
351 DTMF_SW.uRemainDuration[uIndex]--;
352 if(DTMF_SW.uRemainDuration[uIndex] == 0)
353 {
354 if(DTMF_SW.uCurIdx != uIndex)
355 {
356 MD_TRC_MCU_DTMF_UPDATE_TONE_PREV_END(uIndex);
357 DTMF_SW.fEnable[uIndex] = KAL_FALSE;
358 }
359 else
360 {
361 if(DTMF_SW.fIsOn[uIndex])
362 {
363 if( DTMF_SW.pCurrQTMF->off_duration == 0 || DTMF_SW.fClearDTMF)
364 {
365 MD_TRC_MCU_DTMF_UPDATE_TONE_CURR_END(uIndex);
366 DTMF_SW.fEnable[uIndex] = KAL_FALSE;
367 }
368 else
369 {
370 MD_TRC_MCU_DTMF_UPDATE_TONE_CURR_OFF(uIndex);
371 DTMF_SW.fIsOn[uIndex] = KAL_FALSE;
372 DTMF_SW.uRemainDuration[uIndex] = DTMF_SW.uTotalDuration[uIndex] = dtmf_mcu_CheckDuration(DTMF_SW.pCurrQTMF->off_duration);
373 if(DTMF_SW.pCurrQTMF->off_duration)
374 {
375 if(DTMF_SW.fIsToneListQTMF)
376 {
377 DTMF_SW.pCurrQTMF = (L1SP_QTMF *)DTMF_SW.pToneList + DTMF_SW.pCurrQTMF->next_tone;
378 }
379 else
380 {
381 DTMF_SW.pCurrQTMF = (L1SP_QTMF *)(DTMF_SW.pToneList + DTMF_SW.pCurrQTMF->next_tone);
382 }
383 }
384 }
385 }
386 else
387 {
388 MD_TRC_MCU_DTMF_UPDATE_TONE_CURR_ON(uIndex);
389 DTMF_SetKey( DTMF_SW.pHandle, uKey1, (kal_int32)DTMF_SW.pCurrQTMF->freq1, (kal_int32)DTMF_SW.pCurrQTMF->freq2);
390 DTMF_SetKey( DTMF_SW.pHandle, uKey2, (kal_int32)DTMF_SW.pCurrQTMF->freq3, (kal_int32)DTMF_SW.pCurrQTMF->freq4);
391 DTMF_SW.uRemainDuration[DTMF_SW.uCurIdx] = DTMF_SW.uTotalDuration[DTMF_SW.uCurIdx] = dtmf_mcu_CheckDuration(DTMF_SW.pCurrQTMF->on_duration);
392 DTMF_SW.fIsOn[uIndex] = KAL_TRUE;
393 }
394 }
395 }
396 else if(DTMF_SW.uRemainDuration[uIndex] == 1 && DTMF_SW.fIsOn[uIndex])
397 { //ramp down
398 MD_TRC_MCU_DTMF_UPDATE_TONE_RAMPDOWN(uIndex);
399 DTMF_Tone(DTMF_SW.pHandle, uKey1, 0);
400 DTMF_Tone(DTMF_SW.pHandle, uKey2, 0);
401 }
402}
403
404static void dtmf_mcu_Destroy(kal_uint32 arg1, void* arg2)
405{
406
407 //kal_bool fIsAudioRunning = false;//PcmSink_IsAudioRuning() || PcmSink_IsMixerRuning();
408 MD_TRC_MCU_DTMF_DESTROY(DTMF_SW.pHandle, DTMF_SW.fNewDTMF, DTMF_SW.fEnding, DTMF_SW.fForceStop);
409 if(DTMF_SW.pHandle == NULL)
410 {
411 return;
412 }
413 if((DTMF_SW.fNewDTMF == KAL_FALSE && DTMF_SW.fEnding == KAL_TRUE) || DTMF_SW.fForceStop)
414 {
415 {
416 {
417// void AM_SWToneOff( void );
418// AM_SWToneOff();
419 }
420 }
421 kal_take_spinlock(MCUTONESpinLockID, KAL_INFINITE_WAIT);
422 DTMF_SW.pHandle = NULL;
423 DTMF_SW.RingBuffer.rb_base = NULL;
424 memset(&DTMF_SW, 0, sizeof(DTMF_SW));
425 kal_give_spinlock(MCUTONESpinLockID);
426 L1Audio_ClearFlag( DTMF_SW.uAudId);
427 L1Audio_FreeAudioID(DTMF_SW.uAudId);
428 //audio_free_mem( (void **) &DTMF_SW.RingBuffer.rb_base);//
429
430 //if(fIsAudioRunning)
431 // {
432////! PcmSink_Mute(KAL_TRUE, PCMSINK_MUTE_TONE);
433 //kal_sleep_task( AUD_1TICK(uDtmfMuteLength3) );
434 //}
435 //if(DTMF_SW.fIsKeytonePlaying)
436 //{
437////! PcmSink_StopSound(PCM_FUNC_KEYTONE);
438 //}
439 //else if(DTMF_SW.fIsTonePlaying)
440 //{
441////! PcmSink_StopSound(PCM_FUNC_TONE);
442 //}
443 //else
444 //{
445 //ASSERT(0);
446 //}
447
448 //if(fIsAudioRunning)
449 //{
450 //kal_sleep_task( AUD_1TICK(uDtmfMuteLength4) );
451 //}
452////! PcmSink_DepopUnMute( NULL );
453////! PcmSink_Mute(KAL_FALSE, PCMSINK_MUTE_TONE);
454 }
455}
456
457static kal_bool dtmf_mcu_Process_Internal()
458{
459 kal_uint32 uPreIndex1, uPreIndex2, uBufLen, uCurrentData;
460 kal_uint8 *pBuf;
461 kal_bool fIsPlaying = KAL_TRUE;
462 MD_TRC_MCU_DTMF_MCU_PROCESS_INTERNAL_ENTER();
463 kal_take_enh_mutex(MCUTONEMUTEXID);
464 if(DTMF_SW.pHandle == NULL)
465 {
466 kal_give_enh_mutex(MCUTONEMUTEXID);
467 return KAL_FALSE;
468 }
469 rbGetWriteBuffer(&DTMF_SW.RingBuffer, &pBuf, &uBufLen);
470 MD_TRC_MCU_DTMF_PROCESS_ENTRY(DTMF_SW.fNewDTMF, DTMF_SW.fClearDTMF, DTMF_SW.fEnding, uBufLen);
471 if(DTMF_SW.fClearDTMF)
472 {
473 dtmf_mcu_DeActivatAllKey();
474 if(!dtmf_mcu_IsPlaying())
475 {
476 DTMF_SW.fClearDTMF = KAL_FALSE;
477 }
478 }
479 if(uBufLen < DTMF_SW.uFrameByte || (DTMF_SW.fEnding && !DTMF_SW.fNewDTMF) )
480 {
481 kal_give_enh_mutex(MCUTONEMUTEXID);
482 return KAL_FALSE;
483 }
484 dtmf_mcu_GetPreIndex(DTMF_SW.uCurIdx, &uPreIndex1, &uPreIndex2);
485 if(DTMF_SW.fNewDTMF)
486 {
487 dtmf_mcu_ActivatNewKey(uPreIndex1, uPreIndex2);
488 DTMF_SW.fNewDTMF = KAL_FALSE;
489 }
490 else
491 { //flush data
492 fIsPlaying = dtmf_mcu_IsPlaying();
493 uCurrentData = rbGetDataCount(&DTMF_SW.RingBuffer);
494 MD_TRC_MCU_DTMF_PROCESS_STATUS(fIsPlaying, uCurrentData, DTMF_SW.uFlushSilenceCount);
495 if(!fIsPlaying && DTMF_SW.uFlushSilenceCount<DTMF_FLUSH_FRAME_NUMBER)
496 {
497 DTMF_Gen(DTMF_SW.pHandle, pBuf);
498 rbWriteDataDone(&DTMF_SW.RingBuffer, DTMF_SW.uFrameByte);
499 DTMF_SW.uFlushSilenceCount++;
500 }
501 if(!fIsPlaying && uCurrentData==0 && !DTMF_SW.fEnding)
502 {
503////! PcmSink_Mute(KAL_TRUE, PCMSINK_MUTE_TONE);
504 DTMF_SW.fEnding = KAL_TRUE;
505 L1Audio_InProcCall(dtmf_mcu_Destroy, 0, NULL);
506 kal_give_enh_mutex(MCUTONEMUTEXID);
507 return KAL_FALSE;
508 }
509 }
510 if(fIsPlaying)
511 {
512 dtmf_mcu_PrepareTone(0);
513 dtmf_mcu_PrepareTone(1);
514 dtmf_mcu_PrepareTone(2);
515 DTMF_Gen(DTMF_SW.pHandle, pBuf);
516 rbWriteDataDone(&DTMF_SW.RingBuffer, DTMF_SW.uFrameByte);
517 dtmf_mcu_UpdateTone(0);
518 dtmf_mcu_UpdateTone(1);
519 dtmf_mcu_UpdateTone(2);
520 DTMF_SW.fClearDTMF = KAL_FALSE;
521 kal_give_enh_mutex(MCUTONEMUTEXID);
522 return KAL_TRUE;
523 }
524 MD_TRC_MCU_DTMF_MCU_PROCESS_INTERNAL_LEAVE();
525 kal_give_enh_mutex(MCUTONEMUTEXID);
526 return KAL_FALSE;
527}
528
529static void dtmf_mcu_Process(void *pData)
530{
531 kal_bool fContinue;
532 do
533 {
534 fContinue = dtmf_mcu_Process_Internal();
535 }while(fContinue);
536}
537
538
539#define DTMF_MCU_BUFFER_SIZE (19000/4)
540unsigned int dtmf_mcu_buffer[DTMF_MCU_BUFFER_SIZE];
541static void dtmf_mcu_Init(kal_uint16 uSampleRate)
542{
543 kal_uint32 uIntBufSize=0, uPcmBufSize=0, uTotalBufferSize=0;
544 kal_uint8 *pAllocBuf;
545 DTMF_SR uSr=0;
546 memset(&DTMF_SW, 0, sizeof(DTMF_SW));
547 DTMF_SW.uSampleRate = uSampleRate;
548 switch (DTMF_SW.uSampleRate)
549 {
550 case 8000:
551 uSr = DTMF_8K;
552 break;
553 case 11025:
554 uSr = DTMF_11K;
555 break;
556 case 12000:
557 uSr = DTMF_12K;
558 break;
559 case 16000:
560 uSr = DTMF_16K;
561 break;
562 case 22050:
563 uSr = DTMF_22K;
564 break;
565 case 24000:
566 uSr = DTMF_24K;
567 break;
568 case 32000:
569 uSr = DTMF_32K;
570 break;
571 case 44100:
572 uSr = DTMF_44K;
573 break;
574 case 48000:
575 uSr = DTMF_48K;
576 break;
577 default:
578 ASSERT(0);
579 break;
580 }
581 DTMF_GetBufferSize(&uIntBufSize, &uPcmBufSize, uSr, DTMF_MONO);
582 uTotalBufferSize = uIntBufSize + uPcmBufSize * DTMF_BUFFERED_FRAME_NUMBER;
583 MD_TRC_MCU_DTMF_INIT(uSampleRate, uPcmBufSize, uTotalBufferSize);
584 //pAllocBuf = (kal_uint8 *)audio_alloc_mem(uTotalBufferSize);
585 //ASSERT(pAllocBuf);
586 if( (DTMF_MCU_BUFFER_SIZE<<2) < uTotalBufferSize )
587 {
588 MD_TRC_MCU_DTMF_INIT(uSampleRate, (DTMF_MCU_BUFFER_SIZE<<2), uTotalBufferSize);
589 ASSERT(0);
590 }
591 pAllocBuf = (kal_uint8 *)dtmf_mcu_buffer;
592 ASSERT(uIntBufSize);
593 ASSERT(uPcmBufSize);
594 DTMF_SW.uFrameByte = uPcmBufSize;
595 DTMF_SW.RingBuffer.rb_base = (kal_uint8*)pAllocBuf;
596 DTMF_SW.RingBuffer.rb_size = uPcmBufSize * DTMF_BUFFERED_FRAME_NUMBER;
597 DTMF_SW.RingBuffer.write = uPcmBufSize * uPreSilenceLength; //fill a silence to prevent pop up noise
598 DTMF_SW.RingBuffer.read=0;
599 pAllocBuf += uPcmBufSize * DTMF_BUFFERED_FRAME_NUMBER;
600 DTMF_SW.pHandle = DTMF_Init( (void *)pAllocBuf, DTMF_CONTINUOUS, uSr, DTMF_MONO);
601 ASSERT(DTMF_SW.pHandle);
602 DTMF_SW.uAudId = L1Audio_GetAudioID();
603 L1Audio_SetFlag( DTMF_SW.uAudId );
604 L1Audio_SetEventHandler( DTMF_SW.uAudId, dtmf_mcu_Process );
605}
606
607kal_bool DTMF_MCU_IsPlaying()
608{
609 if(DTMF_SW.pHandle)
610 {
611 return KAL_TRUE;
612 }
613 else
614 {
615 return KAL_FALSE;
616 }
617}
618
619kal_bool DTMF_MCU_IsKeytonePlaying()
620{
621 return DTMF_SW.fIsKeytonePlaying;
622}
623
624kal_bool DTMF_MCU_IsTonePlaying()
625{
626 return DTMF_SW.fIsTonePlaying;
627}
628
629void DTMF_MCU_ReadDataDone(kal_uint32 uDataWord)
630{
631 MD_TRC_MCU_DTMF_READ_DATA_DONE(uDataWord);
632 if(DTMF_SW.pHandle)
633 {
634 rbReadDataDone(&DTMF_SW.RingBuffer, uDataWord<<1);
635 }
636}
637
638void DTMF_MCU_GetReadBuffer(kal_int16 **pBuf_16b, kal_uint32 *uDataWord)
639{
640 *pBuf_16b = NULL;
641 *uDataWord = 0;
642 if(DTMF_SW.pHandle)
643 {
644 kal_uint32 uDataByte;
645 kal_uint8 *pBuf_8b;
646 rbGetReadBuffer(&DTMF_SW.RingBuffer, &pBuf_8b, &uDataByte);
647 ASSERT(!((kal_uint32)pBuf_8b & 0x1));
648 *pBuf_16b = (kal_int16*)pBuf_8b;
649 *uDataWord = uDataByte >> 1;
650 }
651 MD_TRC_MCU_DTMF_GET_REAR_BUFFER(*uDataWord);
652}
653
654kal_uint32 DTMF_MCU_GetDataCount()
655{
656 kal_uint32 uDataWord = 0;
657 if(DTMF_SW.pHandle)
658 {
659 uDataWord = (rbGetDataCount(&DTMF_SW.RingBuffer))>>1;
660 }
661 MD_TRC_MCU_DTMF_GET_DATA_COUNT(uDataWord);
662 return uDataWord;
663}
664
665void DTMF_MCU_DataRequestCallback()
666{
667 MD_TRC_MCU_DTMF_DATA_REQUEST(DTMF_SW.pHandle);
668 if(DTMF_SW.pHandle)
669 {
670 //Although dtmf_stop may cause pHandle =NULL, dtmf_mcu_internal_process check pHandle=NULL will return
671 L1Audio_SetEvent( DTMF_SW.uAudId, NULL );
672 }
673}
674
675void DTMF_MCU_StopAndWait()
676{
677 kal_int32 I=0;
678 kal_take_enh_mutex(MCUTONEMUTEXID);
679 DTMF_SW.fNewDTMF = KAL_FALSE;
680 DTMF_SW.fForceStop = KAL_FALSE;
681 if(DTMF_SW.pHandle)
682 {
683 DTMF_SW.fClearDTMF = KAL_TRUE;
684 DTMF_MCU_DataRequestCallback();
685 kal_give_enh_mutex(MCUTONEMUTEXID);
686 while(1)
687 {
688 ////! if(DTMF_SW.fEnding == KAL_TRUE || AM_IsAudioPlaybackOn() == -1 || !PcmSink_IsSoundRuning())
689 if(DTMF_SW.fEnding == KAL_TRUE)
690 {
691 DTMF_SW.fForceStop = KAL_TRUE;
692 dtmf_mcu_Destroy(0, NULL);
693 break;
694 }
695 kal_sleep_task( AUD_1TICK(1) );
696 I++;
697 ASSERT(I<DTMF_STOP_WAIT_TICK);
698 }
699 }
700 else
701 {
702 kal_give_enh_mutex(MCUTONEMUTEXID);
703 }
704
705}
706
707void DTMF_MCU_Stop(kal_bool fIsKeytone)
708{
709 MD_TRC_MCU_DTMF_STOP(DTMF_SW.pHandle);
710 if( (DTMF_SW.fIsKeytonePlaying && !fIsKeytone) || (DTMF_SW.fIsTonePlaying && fIsKeytone) )
711 {
712 return;
713 }
714 kal_take_enh_mutex(MCUTONEMUTEXID);
715 DTMF_SW.fNewDTMF = KAL_FALSE;
716 if(DTMF_SW.pHandle)
717 {
718 DTMF_SW.fClearDTMF = KAL_TRUE;
719 DTMF_MCU_DataRequestCallback();
720 }
721 kal_give_enh_mutex(MCUTONEMUTEXID);
722}
723
724
725void DTMF_MCU_lockInit()
726{
727 MCUTONEMUTEXID= kal_create_enh_mutex( "MCU_TONE_MUTEX" );
728 MCUTONESpinLockID= kal_create_spinlock( "MCU_TONE_LOCK" );
729
730}
731
732void DTMF_MCU_Play( const L1SP_Tones *pToneList, kal_bool fIsQTMF, kal_bool fIsKeytone)
733{
734 //kal_uint32 uSaveMask;
735 //kal_bool fIsAudioRunning = false;//PcmSink_IsAudioRuning() || PcmSink_IsMixerRuning();
736 MD_TRC_MCU_DTMF_PLAY(DTMF_SW.pHandle);
737 if( (DTMF_SW.fIsKeytonePlaying && !fIsKeytone) || (DTMF_SW.fIsTonePlaying && fIsKeytone) )
738 {
739 DTMF_MCU_StopAndWait();
740 }
741 kal_take_enh_mutex(MCUTONEMUTEXID);
742 if(DTMF_SW.pHandle == NULL)
743 {
744 kal_uint16 uSampleRate;
745 //kal_uint8 uChannelNumber;
746////! PcmSink_GetCurrentPcmInfo(&uSampleRate, &uChannelNumber);
747 uSampleRate = 0;
748 //uChannelNumber = 1;
749 if(uSampleRate == 0)
750 {
751 uSampleRate = DTMF_DEFALUT_SAMPLE_RATE;
752 }
753 dtmf_mcu_Init(uSampleRate);
754////! PcmSink_Mute(KAL_TRUE, PCMSINK_MUTE_TONE);
755////! if(fIsAudioRunning)
756////! {
757////! PcmSink_DepopMute(uMuteLength);
758////! if(uDtmfMuteLength1)
759////! {
760////! kal_sleep_task( AUD_1TICK(uDtmfMuteLength1) );
761////! }
762////! }
763 }
764 DTMF_SW.pToneList = pToneList;
765 DTMF_SW.pCurrQTMF = (const L1SP_QTMF *)pToneList;
766 DTMF_SW.fIsToneListQTMF = fIsQTMF;
767 DTMF_SW.fNewDTMF = KAL_TRUE;
768 DTMF_SW.fEnding = KAL_FALSE;
769 DTMF_SW.uFlushSilenceCount = 0;
770 DTMF_MCU_DataRequestCallback();
771
772 if(fIsKeytone && !DTMF_SW.fIsKeytonePlaying)
773 {
774 DTMF_SW.fIsKeytonePlaying = KAL_TRUE;
775////! PcmSink_StartSound(PCM_FUNC_KEYTONE, DTMF_SW.uSampleRate, 2);
776////! if(fIsAudioRunning && uDtmfMuteLength2)
777////! {
778////! kal_sleep_task( AUD_1TICK(uDtmfMuteLength2) );
779////! }
780 }
781 else if(!fIsKeytone && !DTMF_SW.fIsTonePlaying)
782 {
783 DTMF_SW.fIsTonePlaying = KAL_TRUE;
784////! PcmSink_StartSound(PCM_FUNC_TONE, DTMF_SW.uSampleRate, 2);
785////! if(fIsAudioRunning && uDtmfMuteLength2)
786////! {
787////! kal_sleep_task( AUD_1TICK(uDtmfMuteLength2) );
788////! }
789 }
790 kal_give_enh_mutex(MCUTONEMUTEXID);
791 {
792// void AM_SWToneOn( void );
793// AM_SWToneOn();
794 }
795////! PcmSink_Mute(KAL_FALSE, PCMSINK_MUTE_TONE);
796}
797
798//#pragma arm section
799
800#else
801
802void DTMF_MCU_Play( const L1SP_Tones *pToneList, kal_bool fIsQTMF, kal_bool fIsKeytone){}
803void DTMF_MCU_Stop(kal_bool fIsKeytone){}
804void DTMF_MCU_StopAndWait(){}
805void DTMF_MCU_DataRequestCallback(){}
806kal_uint32 DTMF_MCU_GetDataCount(){return 0;}
807void DTMF_MCU_GetReadBuffer(kal_int16 **pBuf_16b, kal_uint32 *uDataWord){}
808void DTMF_MCU_ReadDataDone(kal_uint32 uDataWord){}
809kal_bool DTMF_MCU_IsPlaying(){return KAL_FALSE;}
810kal_bool DTMF_MCU_IsKeytonePlaying(){return KAL_FALSE;}
811
812#endif
813