Index: fhandler_dsp.cc =================================================================== RCS file: /cvs/src/src/winsup/cygwin/fhandler_dsp.cc,v retrieving revision 1.37 diff -u -p -r1.37 fhandler_dsp.cc --- fhandler_dsp.cc 28 May 2004 19:50:05 -0000 1.37 +++ fhandler_dsp.cc 15 Jul 2004 13:40:36 -0000 @@ -80,7 +80,13 @@ class fhandler_dev_dsp::Audio (unsigned char *buffer, int size_bytes); inline void lock () { EnterCriticalSection (&lock_); } inline void unlock () { LeaveCriticalSection (&lock_); } + +// inline void inc (void) { reference_count_++; } +// inline void dec (void) { if (--reference_count_ == 0) delete this; } + void inc (void); + void dec (void); private: + DWORD reference_count_; /* HACK!!!! A quick-and-dirty reference count */ DWORD owner_; /* Process ID when wave operation started, else 0 */ CRITICAL_SECTION lock_; }; @@ -231,6 +237,20 @@ fhandler_dev_dsp::Audio::Audio () InitializeCriticalSection (&lock_); convert_ = &fhandler_dev_dsp::Audio::convert_none; owner_ = 0L; + reference_count_ = 1; // Going to assign right after allocation +} + +void fhandler_dev_dsp::Audio::inc (void) { + reference_count_++; + debug_printf("%08p; ref_count=%ld\n", this, reference_count_); +} + +void fhandler_dev_dsp::Audio::dec (void) { + debug_printf("%08p; ref_count=%ld\n", this, reference_count_-1); + if (--reference_count_ == 0) { + debug_printf("-- deleting\n"); + delete this; + } } fhandler_dev_dsp::Audio::~Audio () @@ -1202,7 +1222,7 @@ fhandler_dev_dsp::close (void) (int)audio_in_, (int)audio_out_); if (audio_in_) { - delete audio_in_; + audio_in_->dec (); audio_in_ = NULL; } if (audio_out_) @@ -1212,7 +1232,7 @@ fhandler_dev_dsp::close (void) // do not wait for all pending audio to be played audio_out_->stop (true); } - delete audio_out_; + audio_out_ -> dec (); audio_out_ = NULL; } if (open_count > 0) @@ -1231,6 +1251,9 @@ fhandler_dev_dsp::dup (fhandler_base * c fhc->audiobits_ = audiobits_; fhc->audiofreq_ = audiofreq_; fhc->audioformat_ = audioformat_; + + fhc->audio_in_ = audio_in_; if (audio_in_) audio_in_->inc (); + fhc->audio_out_ = audio_out_; if (audio_out_) audio_out_->inc (); return 0; }