[OpenBIOS] r418 - cpu/x86
svn at openbios.org
svn at openbios.org
Thu May 24 04:16:30 CEST 2007
Author: wmb
Date: 2007-05-24 04:16:29 +0200 (Thu, 24 May 2007)
New Revision: 418
Modified:
cpu/x86/adpcm.fth
Log:
ADPCM decoder - allocate DMA memory for the sound so "boot" doesn't overwrite it.
OLPC trac #1563
Modified: cpu/x86/adpcm.fth
===================================================================
--- cpu/x86/adpcm.fth 2007-05-23 20:56:34 UTC (rev 417)
+++ cpu/x86/adpcm.fth 2007-05-24 02:16:29 UTC (rev 418)
@@ -257,49 +257,58 @@
d# -9 value playback-volume \ -9 is clipping threshold
-: play-pcm ( adr -- error? )
- wav-in-#ch 0= if drop true exit then
- playback-volume set-volume
- set-sample-rate
- wav-data-adr 4 - le-l@ to /pcm-output
- wav-in-#ch #output-ch <> if
- /pcm-output wav-in-#ch / #output-ch * to /pcm-output
- #output-ch wav-in-#ch < if
- dup condense-pcm \ Skip extra channel data
- else
- dup expand-pcm \ Convert mono to stereo
- then
- then
- /pcm-output (play-pcm)
+0 value pcm-base
+
+: play-raw-pcm ( adr -- error? )
+ wav-in-#ch 0= if drop true exit then ( adr )
+
+ \ Allocate DMA memory for the decoded output
+ wav-data-adr 4 - le-l@ ( adr in-len )
+ dup wav-in-#ch / #output-ch * to /pcm-output ( adr in-len )
+ /pcm-output " dma-alloc" $call-audio to pcm-base ( adr in-len )
+
+ pcm-base swap move ( )
+
+ #output-ch wav-in-#ch < if pcm-base condense-pcm then \ Skip extra channel data
+ #output-ch wav-in-#ch > if pcm-base expand-pcm then \ Convert mono to stereo
+
+ pcm-base /pcm-output (play-pcm)
false
;
: play-ima-adpcm ( adr -- error? )
wav-fact-adr 0= if drop true exit then
- playback-volume set-volume
- set-sample-rate
+
wav-#sample #output-ch * /w* to /pcm-output
- \ Because alloc-mem does not guarantee contiguous physical memory, use load-base area.
- loaded + pagesize round-up tuck ( out in out )
+ \ Allocate DMA memory for the decoded output
+ /pcm-output " dma-alloc" $call-audio to pcm-base
- dup /pcm-output erase ( out in out )
- wav-#sample wav-in-#ch wav-blk-size ( out in out #sample #ch blk-size )
- adpcm-decoder ( out )
- #output-ch 2 = wav-in-#ch 1 = and if ( out )
- dup /pcm-output mono16>stereo16 ( out )
- then ( out )
- /pcm-output (play-pcm) ( )
+ pcm-base /pcm-output erase ( in )
+ pcm-base wav-#sample wav-in-#ch wav-blk-size adpcm-decoder ( )
+ #output-ch 2 = wav-in-#ch 1 = and if ( )
+ pcm-base /pcm-output mono16>stereo16 ( )
+ then ( )
+ pcm-base /pcm-output (play-pcm) ( )
false ( error? )
;
: (play-wav) ( adr -- error? )
+ pcm-base if
+ pcm-base /pcm-output " dma-free" $call-audio
+ 0 to pcm-base
+ then
+
parse-wav-ok? not if ." Not a .wav file" cr true exit then
" /audio" open-dev ?dup 0= if ." Cannot open audio device" cr true exit then
to audio-ih
+
+ playback-volume set-volume
+ set-sample-rate
+
wav-cc case
- 1 of wav-data-adr play-pcm endof
- h# 11 of wav-data-adr play-ima-adpcm endof
+ 1 of wav-data-adr play-raw-pcm endof
+ h# 11 of wav-data-adr play-ima-adpcm endof
( default ) ." Cannot play .wav format type: " dup .wav-cc true swap cr
endcase
audio-ih close-dev
More information about the OpenBIOS
mailing list