www.pudn.com > OS.rar > SndSACM.asm, change:2007-01-21,size:9976b
//============================================== //compiler config //.define LEDDEBUG .define SND_CB_PLAYEND //============================================== .include .\system\GPL162002_Far\include\minios\unOS.inc .include .\system\GPL162002_Far\include\hal\ophw.inc .include .\system\GPL162002_Far\include\system\GPL162002.inc //mgl 2005/03/11 for SPl162001 .include ..\Include\SACM_Constant.inc // for flag / buffer constants .include ..\Include\Snd_ArithmConfig.inc // define compiler config const .include ..\Include\SACM_API.inc .include ..\Include\sacm.inc .include ..\Include\Ram_External.inc //============================================== // Definitions for MiniOS //============================================== .define C_SNDTASK_SACM_DECODE 1 .define C_SNDTASK_SACM_ENCODE 2 .define C_SNDTASK_MS02 5 .define C_SNDTASK_TTS 6 //============================================== .external _unOSSemPost .external _unOSSemPend .external _unOSQPost .external _unOSQPend //MsgID = (unsigned int)unOSQPend(hSndTaskQ,0,&err); .ifndef FARRELEASE MY_unOSQPend: .macro hSndTaskQ,qaz,err R1 = [hSndTaskQ]; R2 = qaz; R3 = err; push R1,R3 to [SP]; //param for unOSQPend call _unOSQPend; sp += 3 .ENDM .else MY_unOSQPend: .macro hSndTaskQ,qaz,err R1 = [hSndTaskQ]; R2 = 0x0000; R3 = qaz; R4 = err; push R1,R4 to [SP]; //param for unOSQPend call _unOSQPend; sp += 4 .ENDM .endif //unOSQPost (hSndTaskQ,(void*)MsgID); .ifndef FARRELEASE MM_unOSQPost: .macro hSndTaskQ,MsgID R1 = [hSndTaskQ]; R2 = MsgID push R1,R2 to [SP]; call _unOSQPost; pop R1,R2 from [SP]; .ENDM .else MM_unOSQPost: .macro hSndTaskQ,MsgID R1 = [hSndTaskQ]; R2 = 0x0000; R3 = MsgID push R1,R3 to [SP]; call _unOSQPost; pop R1,R3 from [SP]; .ENDM .endif //guili 2005/07/20 //msg = unOSMboxPend(hSndMailBox,0,&err); .ifndef FARRELEASE MY_unOSMboxPend: .macro hSndMailBox,qaz,err R1 = [hSndMailBox]; R2 = qaz; R3 = err; push R1,R3 to [SP]; //param for unOSMboxPend call _unOSMboxPend; sp += 3 .ENDM //add for far release,xiaolei 2006/01/03 .else MY_unOSMboxPend: .macro hSndMailBox,qaz,err R1 = [hSndMailBox]; R2 = 0x0000; R3 = qaz; R4 = err; R5 = 0; push R1,R5 to [SP]; //param for unOSMboxPend call _unOSMboxPend; sp += 5 .ENDM .endif //unOSMboxPost (hSndMailBox,(void*)MsgID); .ifndef FARRELEASE MM_unOSMboxPost: .macro hSndMailBox,MsgID R1 = [hSndMailBox]; R2 = MsgID push R1,R2 to [SP]; call _unOSMboxPost; pop R1,R2 from [SP]; .ENDM .else MM_unOSMboxPost: .macro hSndMailBox,MsgID R1 = [hSndMailBox]; R2 = 0x0000; R3 = MsgID R4 = 0; push R1,R4 to [SP]; call _unOSMboxPost; pop R1,R4 from [SP]; .ENDM .endif //============================================== .ifdef C_SND_CTTS_SUPPORT .ifdef C_SND_ETTS_SUPPORT .external _CTTS1BIN_Access_End .external _Snd_CTTS_IsPlaying .define C_CTTS_PLAYING 2 .endif .endif .ifdef C_SND_S200TTS_SUPPORT .external _S200TTS1BIN_Access_End; .endif .ifdef C_SND_S320TTS_SUPPORT .ifdef TTS320FAT//FAT xiaolei modify 2006/03/02 .external _S320TTS1BIN_Access_End; .endif .endif .ifdef C_SND_DVR_SUPPORT .external _SACM_ENCODE_ServiceLoop .external F_ISR_Service_SACM_Encode .define SND_CB_RECEND .external _Snd_onRecEnd .public _Snd_SACM_AudioREC_ISR .endif .external _Snd_onPlayEnd .public _Snd_SACM_AudioFIFO_ISR .ifdef AUDIOBINTREGISTER .public _Snd_SACM_AudioFIFO_ISR1 .endif .public _Snd_SACM_CodecTask .public _Snd_Init_ASM //============================================== //.external _hSndTaskQ //guili 2005/07/20 .external _hSndMailBox //guili 2005/07/20 .external _SndSem_Critical_Err .external _SndTask_unOS_Err .external _SndSACM_curPlayID .external _SndSACM_curCodec .external _SACM_Middle_StopTTS .external _PCMBufferFlag .external _CTTS_EndFlag .external F_SendPCMData .ifdef FAT .external _NFAT_DS_fodenum .endif //============================================== SndSACM_ROM_BLOCK: .SECTION .CODE //============================================== .ifdef C_SND_DVR_SUPPORT _Snd_SACM_AudioREC_ISR: .proc push R1,R5 to [SP]; call F_ISR_Service_SACM_Encode; //clear Interrupt Flag in it cmp R1,1 // R1 = Result jne ?AudioREC_ISR_End; ?AudioREC_ISR_Post: //MM_unOSQPost _hSndTaskQ,C_SNDTASK_SACM_ENCODE MM_unOSMboxPost _hSndMailBox,C_SNDTASK_SACM_ENCODE ?AudioREC_ISR_End: pop R1,R5 from [SP]; retf; .endp .endif //============================================== _Snd_SACM_AudioFIFO_ISR: .proc push R1,R5 to [SP]; r1 = [P_CHA_Ctrl] //clear interrupt [P_CHA_Ctrl] = r1 r1 = [P_CHB_Ctrl] [P_CHB_Ctrl] = r1 //Add for CTTS PCM Data play: .ifdef C_SND_CTTS_SUPPORT R1 = [R_CODEC_TYPE] cmp R1, C_CODEC_CTTS jne ?L_OtherCodec call F_SendPCMData cmp R1, 1 jne ?AudioFIFO_ISR_End call _SACM_Middle_StopTTS .ifdef SND_CB_PLAYEND call _Snd_onPlayEnd jmp ?AudioFIFO_ISR_End .endif ?L_OtherCodec: .endif R1 = FR //2005/03/31,because S320 will change fraction push R1 to [SP] //but '*gain,us' need fraction off,so save FR FRACTION OFF FIR_MOV OFF //2005/03/31,because kernal need FIR_MOV OFF call F_ISR_Service_SACM_Decode; pop R2 from [SP] //2005/03/31 FR = R2 //2005/03/31 cmp R1,2 // R1 = Result jne ?AudioFIFO_ISR_Test; .ifdef SND_CB_PLAYEND call _Snd_onPlayEnd .endif //--2005/09/21 added by mgl for close SP_WORD.200 and SP_WORD.320 and CTTS resource r1 = [_SndSACM_curCodec] .ifdef C_SND_S200TTS_SUPPORT cmp r1,C_CODEC_S200TTS jnz ?L_S320TTSResClose .ifdef FAT call _S200TTS1BIN_Access_End; jmp ?L_ResClodeAll .endif ?L_S320TTSResClose: .endif .ifdef C_SND_S320TTS_SUPPORT cmp r1,C_CODEC_S320TTS jnz ?L_CTTSResClose .ifdef TTS320FAT//FAT //xiaolei modify 2006/03/02 call _S320TTS1BIN_Access_End; jmp ?L_ResClodeAll .endif //end define FAT ?L_CTTSResClose: .endif ?L_ResClodeAll: //---------------------- .ifdef C_SND_CTTS_SUPPORT r1 = [_SndSACM_curCodec] cmp r1,C_CODEC_CTTS jz ?L_PlayIDResetSkip cmp r1,C_CODEC_CTTS_ETTS jz ?L_PlayIDResetSkip .endif .ifdef FAT R1 = -1 //added by chengye 200/9/22 [_NFAT_DS_fodenum] = R1; //GUILI 2005.11.30 .endif R1 = 0; [_SndSACM_curPlayID] = R1; // decoding end. ?L_PlayIDResetSkip: //jmp ?AudioFIFO_ISR_Post //have already end,why post, jmp ?AudioFIFO_ISR_End //so direct end,mgl 2005/05/19 ?AudioFIFO_ISR_Test: R1 = [R_SACM_Play_Flag]; test R1, C_SACM_DECODE_WORK;// Check if decoding jz ?AudioFIFO_ISR_End //r1 != 2, C_SACM_DECODE_WORK, decode ?AudioFIFO_ISR_Post: //guili 2005/07/20 MM_unOSQPost _hSndTaskQ,C_SNDTASK_SACM_DECODE r1=r1; MM_unOSMboxPost _hSndMailBox,C_SNDTASK_SACM_DECODE ?AudioFIFO_ISR_End: pop R1,R5 from [SP]; retf; .endp //======================================================== //=========xiaolei add for AudioB Interrupt:2006/12/20==== .ifdef AUDIOBINTREGISTER _Snd_SACM_AudioFIFO_ISR1: .proc r1 = [P_CHB_Ctrl] [P_CHB_Ctrl] = r1 retf .endp .endif //=====================xiaolei add end 2006/12/20========= //============================================== _Snd_SACM_CodecTask: .proc ?_SACM_CodecTask_loop: .ifdef LEDDEBUG shiftLED; //Debug LED .endif //guili 2005/07/20 MY_unOSQPend _hSndTaskQ,0,_SndTask_unOS_Err MY_unOSMboxPend _hSndMailBox,0,_SndTask_unOS_Err R2 = R1 & 0x00ff ?is_SACM_decode: cmp R2, C_SNDTASK_SACM_DECODE jne ?is_SACM_encode r1 = fr push R1 to [sp] call _SACM_DECODE_ServiceLoop; pop r1 from [sp] fr = r1 goto ?_SACM_CodecTask_loop; ?is_SACM_encode: .ifdef C_SND_DVR_SUPPORT cmp R2, C_SNDTASK_SACM_ENCODE jne ?others call _SACM_ENCODE_ServiceLoop; goto ?_SACM_CodecTask_loop; .endif ?others: goto ?_SACM_CodecTask_loop; retf; .endp //============================================== _Snd_Init_ASM: .proc call F_SACM_DisableAudioTimer //20050124 cfwei, fix GGV startup code problem call F_SACM_DisableDAC1 //20050126 cfwei call F_SACM_DisableDAC2 //20050126 cfwei retf .endp //============================================== //add by mgl 2005/03/15 for unOS changed start,those API have not in new OS lib .ifdef NOTCONDENSE //xiaolei add for HanHai condense the Sound Code .public _Snd_DisINTSrc_AUDIOA .public _Snd_DisINTSrc_AUDIOB .public _Snd_DisINTSrc_TIMERE .public _Snd_DisINTSrc_TIMERF _Snd_DisINTSrc_AUDIOA: .proc __clrb P_CHA_Ctrl,14,r1 .endp _Snd_DisINTSrc_AUDIOB: .proc __clrb P_CHB_Ctrl,14,r1 .endp _Snd_DisINTSrc_TIMERE: .proc __clrb P_TimerE_Ctrl,14,r1 .endp _Snd_DisINTSrc_TIMERF: .proc __clrb P_TimerF_Ctrl,14,r1 .endp .endif //add by mgl 2005/03/15 for unOS changed end //============================================== //============================================== .ifdef LEDDEBUG shiftLED: .MACRO R2 = [_shiftLED_iLED]; R1 = [_shiftLED_LEDDir]; jz ?shiftLED_R; ?shiftLED_L: R2 = R2 lsl 1; cmp R2, 0x0100; jne ?shiftLED_End; R2 = 0x0101; jmp ?shiftLED_End; ?shiftLED_R: R2 = R2 lsr 1; cmp R2, 0x0080; jne ?shiftLED_End; R2 = 0x8080; ?shiftLED_End: [_shiftLED_iLED] = R2; R1 = 0XFFFF; [P_IOA_Dir] = R1; R1 = 0XFFFF; [P_IOA_Attrib] = R1; R1 = [_shiftLED_oLED]; R1 ^= R2; [P_IOA_Data] = R1; .ENDM .endif //========SndSACM.asm=========================== .ifdef MP3_TASK_TIMETEST .external _Timer_Count .public _TimerA_ISR_Service .public _Start_TimerA _TimerA_ISR_Service:.proc R1 = [P_TimerA_Ctrl] [P_TimerA_Ctrl] = R1 R1 = [_Timer_Count] R2 = [_Timer_Count + 1] R1 += 1 R2 += 0, Carry [_Timer_Count] = R1 [_Timer_Count + 1] = R2 retf .endp _Start_TimerA:.proc call _unOSIrqOff push R1 to [sp] R1 = 0xfffe [P_TimerA_Preload] = R1 R1 = 0x6062 [P_TimerA_Ctrl] = R1 pop R1 from [sp] call _unOSIrqOn retf .endp .endif //End of MP3_TASK_TIMETEST