Author: wmb Date: 2009-12-14 11:01:05 +0100 (Mon, 14 Dec 2009) New Revision: 1596
Modified: dev/hdaudio/core.fth dev/hdaudio/test.fth Log: HDAudio driver and selftest - significant changes to reduce memory leaks, prevent reentrancy in the selftest, and clean up after sound completion.
Modified: dev/hdaudio/core.fth =================================================================== --- dev/hdaudio/core.fth 2009-12-14 09:48:18 UTC (rev 1595) +++ dev/hdaudio/core.fth 2009-12-14 10:01:05 UTC (rev 1596) @@ -78,11 +78,11 @@
\ \ Stream Descriptors \ Default: 48kHz 16bit stereo -0 instance value sample-base -0 instance value sample-mul -0 instance value sample-div -1 instance value sample-format -2 instance value #channels +0 value sample-base +0 value sample-mul +0 value sample-div +1 value sample-format +2 value #channels
: stream-format ( -- u ) sample-base d# 14 lshift ( acc ) @@ -107,7 +107,7 @@
\ Stream descriptor register interface. \ There are multiple stream descriptors, each with their own register set. -0 instance value sd# +0 value sd# : sd+ ( offset -- adr ) sd# h# 20 * + au + ;
: sdctl h# 80 sd+ ; @@ -239,8 +239,8 @@ : init-codec ( -- ) detect-codec open-codec ; : close-controller ( -- ) reset unmap-regs ;
-d# 48.000 instance value sample-rate -1 instance value scale-factor +d# 48.000 value sample-rate +1 value scale-factor
: low-rate? ( Hz ) dup d# 48.000 < swap d# 44.100 <> and ;
@@ -404,7 +404,8 @@ upsample-channel \ left src 2+ to src dst 2+ to dst upsample-channel \ right - dst 2 - /dst ( dst dst-len ) + dst 2- to dst ( ) + dst /dst ( dst dst-len ) ;
\ \ Amplifier control @@ -453,11 +454,12 @@ stop-stream free-bdl release-sound-buffer + uninstall-playback-alarm ; : write-done ( -- ) wait-stream-done (write-done) ;
: write ( adr len -- actual ) - 4 to sd# audio-out install-playback-alarm true to playing? + 4 to sd# audio-out true to playing? install-playback-alarm ;
: ?end-sound ( -- ) @@ -475,11 +477,25 @@ \ Alarm handle to stop the stream when the content has been played. : playback-completed-alarm ( -- ) stop-lock if exit then - playing? if sd# ?end-sound to sd# then + playing? if + sd# ?end-sound to sd# + else + \ If playback has already stopped as a result of + \ someone else having waited for completion, we + \ just uninstall ourself. + uninstall-playback-alarm + then ;
' playback-completed-alarm is playback-alarm
+: still-playing? ( -- flag ) + playing? 0= if false exit then + stop-lock if true exit then + sd# ?end-sound to sd# + playing? +; + : wait-sound ( -- ) true to stop-lock begin playing? while d# 10 ms ?end-sound repeat
Modified: dev/hdaudio/test.fth =================================================================== --- dev/hdaudio/test.fth 2009-12-14 09:48:18 UTC (rev 1595) +++ dev/hdaudio/test.fth 2009-12-14 10:01:05 UTC (rev 1596) @@ -8,11 +8,9 @@ record-base record-len la1+ " dma-free" $call-parent ;
-: jingle ( -- ) " play-wav rom:splash" evaluate wait-sound ; - : ?key-abort ( -- ) key? if - key h# 1b = abort" Aborting" + key h# 1b = if ." Aborting" abort then then ; : speaker-test ( -- ) @@ -21,14 +19,8 @@ ." Disconnect headphones to continue.. " begin ?key-abort pin-sense? 0= until cr then - ." Playing jingle on the left speaker.. " - true to right-mute? - jingle cr - false to right-mute? - true to left-mute? - ." Playing jingle on the right speaker.. " - jingle cr - false to left-mute? + ." Playing left to right sweep " + make-sweep 0 set-volume play cr ;
: headphones-test ( -- ) @@ -37,9 +29,8 @@ ." Connect headphones to continue.. " begin ?key-abort pin-sense? until cr then - ." Press a key to play sound.. " key drop cr h# 1f to node power-off \ turn off speaker - jingle + make-sweep -9 set-volume play h# 1f to node power-on \ turn speaker back on ;