diff options
-rw-r--r-- | services/audioflinger/AudioFlinger.cpp | 21 | ||||
-rw-r--r-- | services/audioflinger/AudioFlinger.h | 10 |
2 files changed, 25 insertions, 6 deletions
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp index e2b29f7..0c86e20 100644 --- a/services/audioflinger/AudioFlinger.cpp +++ b/services/audioflinger/AudioFlinger.cpp @@ -246,14 +246,13 @@ void AudioFlinger::onFirstRef() AudioFlinger::~AudioFlinger() { - while (!mRecordThreads.isEmpty()) { // closeInput() will remove first entry from mRecordThreads - closeInput(mRecordThreads.keyAt(0)); + closeInput_nonvirtual(mRecordThreads.keyAt(0)); } while (!mPlaybackThreads.isEmpty()) { // closeOutput() will remove first entry from mPlaybackThreads - closeOutput(mPlaybackThreads.keyAt(0)); + closeOutput_nonvirtual(mPlaybackThreads.keyAt(0)); } for (size_t i = 0; i < mAudioHwDevs.size(); i++) { @@ -5863,7 +5862,7 @@ AudioFlinger::RecordHandle::RecordHandle(const sp<AudioFlinger::RecordThread::Re } AudioFlinger::RecordHandle::~RecordHandle() { - stop(); + stop_nonvirtual(); } sp<IMemory> AudioFlinger::RecordHandle::getCblk() const { @@ -5876,6 +5875,10 @@ status_t AudioFlinger::RecordHandle::start(int event, int triggerSession) { } void AudioFlinger::RecordHandle::stop() { + stop_nonvirtual(); +} + +void AudioFlinger::RecordHandle::stop_nonvirtual() { ALOGV("RecordHandle::stop()"); mRecordTrack->stop(); } @@ -6847,6 +6850,11 @@ audio_io_handle_t AudioFlinger::openDuplicateOutput(audio_io_handle_t output1, status_t AudioFlinger::closeOutput(audio_io_handle_t output) { + return closeOutput_nonvirtual(output); +} + +status_t AudioFlinger::closeOutput_nonvirtual(audio_io_handle_t output) +{ // keep strong reference on the playback thread so that // it is not destroyed while exit() is executed sp<PlaybackThread> thread; @@ -6998,6 +7006,11 @@ audio_io_handle_t AudioFlinger::openInput(audio_module_handle_t module, status_t AudioFlinger::closeInput(audio_io_handle_t input) { + return closeInput_nonvirtual(input); +} + +status_t AudioFlinger::closeInput_nonvirtual(audio_io_handle_t input) +{ // keep strong reference on the record thread so that // it is not destroyed while exit() is executed sp<RecordThread> thread; diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h index a6fd0a0..fa1ad93 100644 --- a/services/audioflinger/AudioFlinger.h +++ b/services/audioflinger/AudioFlinger.h @@ -844,7 +844,7 @@ private: int frameCount, const sp<IMemory>& sharedBuffer, int sessionId); - ~TimedTrack(); + virtual ~TimedTrack(); class TimedBuffer { public: @@ -1494,6 +1494,9 @@ private: uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags); private: const sp<RecordThread::RecordTrack> mRecordTrack; + + // for use from destructor + void stop_nonvirtual(); }; //--- Audio Effect Management @@ -1887,7 +1890,7 @@ mutable Mutex mLock; // mutex for process, commands and handl public: AudioHwDevice(const char *moduleName, audio_hw_device_t *hwDevice) : mModuleName(strdup(moduleName)), mHwDevice(hwDevice){} - ~AudioHwDevice() { free((void *)mModuleName); } + /*virtual*/ ~AudioHwDevice() { free((void *)mModuleName); } const char *moduleName() const { return mModuleName; } audio_hw_device_t *hwDevice() const { return mHwDevice; } @@ -1964,6 +1967,9 @@ mutable Mutex mLock; // mutex for process, commands and handl private: sp<Client> registerPid_l(pid_t pid); // always returns non-0 + // for use from destructor + status_t closeOutput_nonvirtual(audio_io_handle_t output); + status_t closeInput_nonvirtual(audio_io_handle_t input); }; |