?? mpa_output.s
字號:
/*
* 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 + -