diff --git a/Audio/CHANGES b/Audio/CHANGES index 849d20261..c36010719 100644 --- a/Audio/CHANGES +++ b/Audio/CHANGES @@ -9,12 +9,22 @@ * * \**********************************************/ +* 28th Sept 1889 -- Fixed a bug associated with exiting the + program with sounds still playing. + Fixed a bug associated with using the + package in the absence of a sound card. + Added a new member function "working" + which is the opposite of "not_working", + (as demanded by a bunch of rabid optimists)! + Fixed a couple of typo's in the manual. + * 23rd Sept 1998 -- The Good News: Finally got around to getting the pitch envelope working. (Hooray) The Bad News: This costs quite a bit in performance - and it was a MAJOR rewrite of significant parts of the internals, so we may need some bug fixes. + This version is 0.5 * 7th July 1998 -- Fixed some error checking in slSample.cxx and a missing declaration in sl.h diff --git a/example/example.cxx b/example/example.cxx index f12ca2939..ae519786d 100644 --- a/example/example.cxx +++ b/example/example.cxx @@ -55,39 +55,15 @@ int main () int tim = 0 ; /* My periodic event timer. */ - slEnvelope pitch_envelope ( 3, SL_SAMPLE_LOOP ) ; - slEnvelope p_envelope ( 1, SL_SAMPLE_ONE_SHOT ) ; - slEnvelope volume_envelope ( 3, SL_SAMPLE_LOOP ) ; - while ( SL_TRUE ) { - - tim++ ; /* Time passes */ + tim++ ; /* Time passes */ if ( tim % 200 == 0 ) sched.playSample ( s1 ) ; if ( tim % 180 == 0 ) sched.playSample ( s2 ) ; if ( tim % 150 == 0 ) sched.playSample ( s3 ) ; if ( tim % 120 == 0 ) sched.playSample ( s4 ) ; - if ( tim == 60 ) { - // introduce an envelope for our engine noise after 10 seconds - - pitch_envelope.setStep ( 0, 0.0, 1.0 ) ; - pitch_envelope.setStep ( 1, 5.0, 2.0 ) ; - pitch_envelope.setStep ( 2, 10.0, 1.0 ) ; - - p_envelope.setStep ( 0, 5.0, 2.0 ) ; - - volume_envelope.setStep ( 0, 0.0, 1.0 ) ; - volume_envelope.setStep ( 1, 5.0, 2.0 ) ; - volume_envelope.setStep ( 2, 10.0, 1.0 ) ; - - // scheduler -> playSample ( my_sample ) ; - sched.addSampleEnvelope( s, 0, 0, &p_envelope, SL_PITCH_ENVELOPE ); - sched.addSampleEnvelope( s, 0, 1, &volume_envelope, SL_VOLUME_ENVELOPE); - } - - /* For the sake of realism, I'll delay for 1/30th second to simulate a graphics update process. diff --git a/src/sl.h b/src/sl.h index dd026b7f0..5cbbc2adf 100644 --- a/src/sl.h +++ b/src/sl.h @@ -24,15 +24,14 @@ typedef unsigned short Ushort ; #define SL_DEFAULT_SAMPLING_RATE 11025 -/* Set if the next slScheduler::update will die */ -extern char *__slPendingError ; - class slSample ; class slSamplePlayer ; class slEnvelope ; class slScheduler ; class slDSP ; +extern char *__slPendingError ; + class slDSP { private: @@ -167,12 +166,9 @@ public: ~slSample () { - if ( ref_count != 0 ) - { - if ( __slPendingError == NULL ) + if ( ref_count != 0 && __slPendingError == NULL ) __slPendingError = - "slXXXX: FATAL ERROR - Application deleted a sample while it was playing.\n" ; - } + "slSample: FATAL ERROR - Application deleted a sample while it was playing.\n" ; delete buffer ; } @@ -331,12 +327,9 @@ public: ~slEnvelope () { - if ( ref_count != 0 ) - { - if ( __slPendingError == NULL ) + if ( ref_count != 0 && __slPendingError == NULL ) __slPendingError = - "slXXXX: FATAL ERROR - Application deleted an envelope while it was playing.\n" ; - } + "slEnvelope: FATAL ERROR - Application deleted an envelope while it was playing.\n" ; delete time ; delete value ; diff --git a/src/slDSP.cxx b/src/slDSP.cxx index fbb0da32b..a8a96d4da 100644 --- a/src/slDSP.cxx +++ b/src/slDSP.cxx @@ -336,6 +336,9 @@ void slDSP::sync () void slDSP::stop () { + if ( error ) + return ; + waveOutReset( hWaveOut ); } @@ -647,6 +650,9 @@ float slDSP::secondsUsed () void slDSP::sync () { + if ( error ) + return ; + /* found this in the header file - but no description * or example for the long parameter. */ diff --git a/src/slScheduler.cxx b/src/slScheduler.cxx index dd29a7896..5fe4caa91 100644 --- a/src/slScheduler.cxx +++ b/src/slScheduler.cxx @@ -1,9 +1,10 @@ #include "sl.h" -slScheduler *slScheduler::current = NULL ; char *__slPendingError = NULL ; +slScheduler *slScheduler::current = NULL ; + void slScheduler::init () { current = this ; @@ -49,7 +50,8 @@ void slScheduler::init () void slScheduler::initBuffers () { - if ( not_working () ) return ; + if ( not_working () ) + return ; delete mixer_buffer ; delete spare_buffer0 ; @@ -118,17 +120,17 @@ void slScheduler::mixBuffer ( slSamplePlayer *spa, slSamplePlayer *spb, void slScheduler::realUpdate ( int dump_first ) { - int i ; - if ( not_working () ) return ; if ( __slPendingError != NULL ) { - fprintf ( stderr, __slPendingError ) ; - exit ( 1 ) ; + fprintf ( stderr, "%s", __slPendingError ) ; + exit ( 1 ) ; } + int i ; + while ( secondsUsed() <= safety_margin ) { slSamplePlayer *psp [ 3 ] ; @@ -208,6 +210,9 @@ void slScheduler::realUpdate ( int dump_first ) void slScheduler::addCallBack ( slCallBack c, slSample *s, slEvent e, int m ) { + if ( not_working () ) + return ; + if ( num_pending_callbacks >= SL_MAX_CALLBACKS ) { fprintf ( stderr, "slScheduler: Too many pending callback events!\n" ) ; @@ -224,6 +229,9 @@ void slScheduler::addCallBack ( slCallBack c, slSample *s, slEvent e, int m ) void slScheduler::flushCallBacks () { + if ( not_working () ) + return ; + /* Execute all the callbacks that we accumulated in this iteration.