⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mpa_output.s

📁 samsung 9908DVD源代码,
💻 S
📖 第 1 页 / 共 3 页
字号:
/*
 *  mpa_output.s
 *
 *  MPEG/audio multichannel decoder.
 *	Copyright (C) 2003 Optical Player P/J, Samsung Electronics.
 *
 *  Output audio to IIS module or write file (*.pcm).
 */

.include	"mpa.h"

.secFILE_mpa_output

.if( OUPUT_2CH == TRUE )

/********************************************************************

 Function:		output_pcm_sample	(2-ch only)

 Description:	output channel mode:
 				
					typedef enum {
						AUDIO_NULL,
						MPEG1_MONO,
						MPEG1_STEREO,
						MPEG2_5CH,
						MPEG2_7CH,
						CHANNEL_TEST	// output test tone
					} MPA_Output_t;

				pcm_ch_buffer sample array:
				<---------  fixed length  --------->
				+----+----+----+----+----+----+----+-----------+
				|  L |  R |  C | Ls | Rs | Lc | Rc | ... next  |
				+----+----+----+----+----+----+----+-----------+

				audio buffer map:
				
				2-channel mode

				<----------  sample per each channel ---------->
				+---+---+---+---+---+---+----------------------+
				| L | R | L | R | L | R |       ....           |
				+---+---+---+---+---+---+----------------------+
				... 1152 th sample of channel 

				Configuration of SBF1 write mode:
				 - 16-bit mode 
				 	(1) MAC[23:8] => EMEM[15:0]
						mOVERFLOW_CHECK	An :  "eadd An, p"
								 	
				    (2) MAC[15:0] => EMEM[15:0]
				    	mOVERFLOW_CHECK	An :  "esra8 An" and "eincc An"

				 - 24-bit mode => MAC[23:0] => EMEM[31:0], zero extension

 Arguments:		
				index registers:
				@bank0
						d1		d0		s1		s0
				---------------------------------------
				sd0: 	 1 		 x	     -       1
				sd1: 	 x 		 x	     x       1
				sd2: 	 x 		 x	     x       1
				sd3:	 x		 0		 x	     x		SBF1

********************************************************************/
output_pcm_sample::
				er			xsd
				eld			sd0, #0x1001
				eld			sd1, #0x0001
				eld			sd2, #0x0001
				eld			sd3, #0x0000
				
				eld			rp0, #pcm_ch_buffer
	.if( _DECODER_TYPE != MPEG_1_AUDIO )
				eld			rp1, #pcm_dm_buffer
				eld			rp2, #pcm_lfe_buffer
	.endif
				eld			rp3, #SBF1_PTR

				ldw			a11, @[a10+_pParameter]
				ldb			r0, @[a11+_CH_Mode]
				ldb			r1, @[a11+_CH_Content]
				ldb			r2, @[a11+_LFE_Enable]
				ldb			r3, @[a10+_OutPCMSize]				
				ldw			a9, @[a10+_OutputBufferOffset]

				eld			d, #0				; zero sample
				ld			r6, #SAMPLES_PER_FRAME-1
				eld			a, rpd0.layer
				ecp			a, #LAYER_I
				ebra		ec1, %f2
				eld			a, rpd1.mpeg_version
				ecp			a, #_MPEG_1_AUDIO
				ebra		ec1, %f2
				ld			r6, #SAMPLES_PER_FRAME/3-1
				eld			a, rpd1.frameNo
				eld			b, #3
				mDIVIDE		a, b
				ecp			b, #0
				ebra		ec0, %f2
				ecld		r7, b
				dec			r7
				ld			r4, #0x1800
				cmp			eq, r3, #PCM_SAMPLE_24BITS
				brf			%f1
				sl			r4
%1				bnzd		r7, $
				add			a9, r4


; configuration of SBF1 write mode
%2				ld			a8, #SFR_BASE
				ldw			r4, @[a8+rCONFIG0]
				and			r4, #0xf0ff
				cmp			eq, r3, #PCM_SAMPLE_24BITS
				brt			mode_24bit
mode_16bit		or			r4, #0x0600
mode_24bit		ldw			@[a8+rCONFIG0], r4
				ldw			@[a8+rSBL1OFF], a9

; check channel mode
				cmp			eq, r0, #_MPEG1_MONO
				brt			chmd_mono
				cmp			eq, r0, #_MPEG1_STEREO
				brt			chmd_stereo
; if chmd set to _MPEG2_5CH or _MPEG2_7CH
				eld			a, rpd1.mc_channel
				ecp			a, #0
				ebra		ec1, chmd_downmix
				eld			b, rpd1.stereo
				ecp			b, #STEREO
				ebra		ec0, chmd_stereo
				ecp			b, #MONO
				ebra		ec0, chmd_mono
/** debug **/	bra			chmd_stereo


;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;::::::::::::::::::::[  channel config: MONO  ]::::::::::::::::::::::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
chmd_mono		esd0		s1, #MAX_CHANNEL
				cmp			eq, r1, #0			; channel content -> left ch
				brt			chmd_L_mono
				cmp			eq, r1, #1			; channel content -> right ch
				brf			chmd_L_mono

				erpn		rp0, #1				
chmd_R_mono		eld			a, @rp0+s1			; R

				eld			@rp3+d0, a			; L
				bnzd		r6, chmd_R_mono
				eld			@rp3+d0, a			; R
				bra			end_audio_output

chmd_L_mono		eld			a, @rp0+s1			; L

				eld			@rp3+d0, a			; L)
				bnzd		r6, chmd_L_mono
				eld			@rp3+d0, a			; R
				bra			end_audio_output


;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;:::::::::::::::::::[  channel config: STEREO  ]:::::::::::::::::::::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
chmd_stereo		esd0		s1, #MAX_CHANNEL-1
				
				;eld			a, rpd1.stereo
				;ecp			a, #MONO
				;ebra		ec0, chmd_mono

				;cmp			eq, r2, #TRUE
				;brf			chmd_stereo_2ch
				;eld			a, rpd0.lfe
				;ecp			a, #TRUE
				;ebra		ec0, chmd_stereo_lfe

chmd_stereo_2ch	eld			a, @rp0+s0			; L
				eld			b, @rp0+s1			; R

				eld			@rp3+d0, a			; L
				bnzd		r6, chmd_stereo_2ch
				eld			@rp3+d0, b			; R
				bra			end_audio_output

null_audio_output:
				eld			@rp3+d0, d			; L
				bnzd		r6, null_audio_output
				eld			@rp3+d0, d			; R

end_audio_output:
				ret


;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;:::::::::::::::::::[  channel config: DOWNMIX  ]::::::::::::::::::::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
chmd_downmix	eld			a, @rp1+s0			; Lo
				eld			b, @rp1+s0			; Ro

				eld			@rp3+d0, a			; L
				bnzd		r6, chmd_downmix
				eld			@rp3+d0, b			; R
				bra			end_audio_output

.endif /* .if( OUPUT_2CH == TRUE ) */


.if( OUPUT_6CH == TRUE )

/********************************************************************

 Function:		output_pcm_sample

 Description:	output channel mode:
 				
					typedef enum {
						AUDIO_NULL,
						MPEG1_MONO,
						MPEG1_STEREO,
						MPEG2_5CH,
						MPEG2_7CH,
						CHANNEL_TEST	// output test tone
					} MPA_Output_t;

				pcm_ch_buffer sample array:
				<---------  fixed length  --------->
				+----+----+----+----+----+----+----+-----------+
				|  L |  R |  C | Ls | Rs | Lc | Rc | ... next  |
				+----+----+----+----+----+----+----+-----------+

				pcm_dm_buffer sample array:				
				+----+----+----+----+-------------+
				| Lo | Ro | Lo | Ro |   ... next  |
				+----+----+----+----+-------------+

				pcm_lfe_buffer sample array:				
				+----+----+----+----+-------------+
				| s1 | s2 | s3 | s4 |   ... next  |
				+----+----+----+----+-------------+


				audio buffer map:
				
				8-channel mode (MPEG2_7CH)

				<----------  sample per each channel ---------->
				+-------+----+----+----+-------+----+-----+----+
				| L(Lo) | Ls |  C | Lc | R(Ro) | Rs | LFE | Rc | 
				+-------+----+----+----+-------+----+-----+----+
				... 1152 th sample of channel 


				6-channel mode (MPEG2_5CH) without augmentation channel 

				<-----  sample per each channel ----->
				+-------+----+----+-------+----+-----+
				| L(Lo) | Ls |  C | R(Ro) | Rs | LFE |
				+-------+----+----+-------+----+-----+
				... 1152 th sample of channel 
				NOTE: In downmix mode, other channels are pilled by zero

				Configuration of SBF1 write mode:
				 - 16-bit mode 
				 	(1) MAC[23:8] => EMEM[15:0]
						mOVERFLOW_CHECK	An :  "eadd An, p"
								 	
				    (2) MAC[15:0] => EMEM[15:0]
				    	mOVERFLOW_CHECK	An :  "esra8 An" and "eincc An"

				 - 24-bit mode => MAC[23:0] => EMEM[31:0], zero extension

 Arguments:		
				index registers:
				@bank0
						d1		d0		s1		s0
				---------------------------------------
				sd0: 	 1 		 x	     -       1
				sd1: 	 x 		 x	     x       1
				sd2: 	 x 		 x	     x       1
				sd3:	 x		 0		 x	     x		SBF1

********************************************************************/
output_pcm_sample::
				er			xsd
				eld			sd0, #0x1001
				eld			sd1, #0x0001
				eld			sd2, #0x0001
				eld			sd3, #0x0000
				
				eld			rp0, #pcm_ch_buffer
	.if( _DECODER_TYPE != MPEG_1_AUDIO )
				eld			rp1, #pcm_dm_buffer
				eld			rp2, #pcm_lfe_buffer
	.endif
				eld			rp3, #SBF1_PTR

				ldw			a11, @[a10+_pParameter]
				ldb			r0, @[a11+_CH_Mode]
				ldb			r1, @[a11+_CH_Content]
				ldb			r2, @[a11+_LFE_Enable]
				ldb			r3, @[a10+_OutPCMSize]				
				ldw			a9, @[a10+_OutputBufferOffset]

				eld			d, #0				; zero sample
				ld			r6, #SAMPLES_PER_FRAME-1
				eld			a, rpd0.layer
				ecp			a, #LAYER_I
				ebra		ec1, %f2
				eld			a, rpd1.mpeg_version
				ecp			a, #_MPEG_1_AUDIO
				ebra		ec1, %f2
				ld			r6, #SAMPLES_PER_FRAME/3-1
				eld			a, rpd1.frameNo
				eld			b, #3
				mDIVIDE		a, b
				ecp			b, #0
				ebra		ec0, %f2
				ecld		r7, b
				dec			r7
				ld			r4, #0x1800
				cmp			eq, r3, #PCM_SAMPLE_24BITS
				brf			%f1
				sl			r4
%1				bnzd		r7, $
				add			a9, r4


; configuration of SBF1 write mode
%2				ld			a8, #SFR_BASE
				ldw			r4, @[a8+rCONFIG0]
				and			r4, #0xf0ff
				cmp			eq, r3, #PCM_SAMPLE_24BITS
				brt			mode_24bit
mode_16bit		or			r4, #0x0600
mode_24bit		ldw			@[a8+rCONFIG0], r4
				ldw			@[a8+rSBL1OFF], a9

; check channel mode
				cmp			eq, r0, #_MPEG1_MONO
				brt			chmd_mono
				cmp			eq, r0, #_MPEG1_STEREO
				brt			chmd_stereo
; if chmd set to _MPEG2_5CH or _MPEG2_7CH
				eld			a, rpd1.mc_channel
				ecp			a, #0
				ebra		ec1, chmd_multich
				eld			b, rpd1.stereo
				ecp			b, #STEREO
				ebra		ec0, chmd_stereo
				ecp			b, #MONO
				ebra		ec0, chmd_mono
/** debug **/	bra			chmd_stereo

chmd_multich	cmp			eq, r0, #_MPEG2_DOWNMIX
				brt			chmd_downmix_51ch
				
				cmp			eq, r0, #_MPEG2_5CH
				brt			chmd_5ch_with_lfe
				cmp			eq, r0, #_MPEG2_7CH
				brt			chmd_7ch_with_lfe
				cmp			eq, r0, #_AUDIO_NULL
				brt			null_audio_output
				brf			null_audio_output


;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;::::::::::::::::::::[  channel config: MONO  ]::::::::::::::::::::::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
chmd_mono		esd0		s1, #MAX_CHANNEL
				cmp			eq, r1, #0			; channel content -> left ch
				brt			chmd_L_mono
				cmp			eq, r1, #1			; channel content -> right ch
				brf			chmd_L_mono

				erpn		rp0, #1				
chmd_R_mono		eld			a, @rp0+s1			; R

				eld			@rp3+d0, a			; L(Lo)
				eld			@rp3+d0, d			; Ls
				eld			@rp3+d0, d			; C
				eld			@rp3+d0, a			; R(Ro)
				eld			@rp3+d0, d			; Rs
				bnzd		r6, chmd_R_mono
				eld			@rp3+d0, d			; Lfe
				bra			end_audio_output

chmd_L_mono		eld			a, @rp0+s1			; L

				eld			@rp3+d0, a			; L(Lo)
				eld			@rp3+d0, d			; Ls
				eld			@rp3+d0, d			; C
				eld			@rp3+d0, a			; R(Ro)
				eld			@rp3+d0, d			; Rs
				bnzd		r6, chmd_L_mono
				eld			@rp3+d0, d			; Lfe
				bra			end_audio_output


chmd_mono_2ndST	esd0		s1, #MAX_CHANNEL-2
				
_2ndST			eld			a, @rp0+s0			; MONO
				eld			b, @rp0+s0			; L2
				eld			c, @rp0+s1			; R2

				eld			@rp3+d0, a			; L(Lo)
				eld			@rp3+d0, b			; Ls
				eld			@rp3+d0, d			; C
				eld			@rp3+d0, a			; R(Ro)
				eld			@rp3+d0, c			; Rs
				bnzd		r6, _2ndST
				eld			@rp3+d0, d			; Lfe
				bra			end_audio_output

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -