diff options
Diffstat (limited to 'services')
-rw-r--r-- | services/audioflinger/Threads.cpp | 62 | ||||
-rw-r--r-- | services/audioflinger/Threads.h | 7 | ||||
-rw-r--r-- | services/audioflinger/Tracks.cpp | 4 | ||||
-rw-r--r-- | services/audiopolicy/managerdefault/AudioPolicyManager.cpp | 5 | ||||
-rw-r--r-- | services/camera/libcameraservice/api2/CameraDeviceClient.h | 5 |
5 files changed, 55 insertions, 28 deletions
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp index ad445a5..489f2d4 100644 --- a/services/audioflinger/Threads.cpp +++ b/services/audioflinger/Threads.cpp @@ -4459,6 +4459,17 @@ void AudioFlinger::DirectOutputThread::processVolume_l(Track *track, bool lastTr } } +void AudioFlinger::DirectOutputThread::onAddNewTrack_l() +{ + sp<Track> previousTrack = mPreviousTrack.promote(); + sp<Track> latestTrack = mLatestActiveTrack.promote(); + + if (previousTrack != 0 && latestTrack != 0 && + (previousTrack->sessionId() != latestTrack->sessionId())) { + mFlushPending = true; + } + PlaybackThread::onAddNewTrack_l(); +} AudioFlinger::PlaybackThread::mixer_state AudioFlinger::DirectOutputThread::prepareTracks_l( Vector< sp<Track> > *tracksToRemove @@ -4468,7 +4479,6 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::DirectOutputThread::prep mixer_state mixerStatus = MIXER_IDLE; bool doHwPause = false; bool doHwResume = false; - bool flushPending = false; // find out which tracks need to be processed for (size_t i = 0; i < count; i++) { @@ -4478,6 +4488,12 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::DirectOutputThread::prep continue; } + if (t->isInvalid()) { + ALOGW("An invalidated track shouldn't be in active list"); + tracksToRemove->add(t); + continue; + } + Track* const track = t.get(); audio_track_cblk_t* cblk = track->cblk(); // Only consider last track started for volume and mixer state control. @@ -4497,7 +4513,7 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::DirectOutputThread::prep } else if (track->isFlushPending()) { track->flushAck(); if (last) { - flushPending = true; + mFlushPending = true; } } else if (track->isResumePending()) { track->resumeAck(); @@ -4538,6 +4554,21 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::DirectOutputThread::prep // compute volume for this track processVolume_l(track, last); if (last) { + sp<Track> previousTrack = mPreviousTrack.promote(); + if (previousTrack != 0) { + if (track != previousTrack.get()) { + // Flush any data still being written from last track + mBytesRemaining = 0; + // flush data already sent if changing audio session as audio + // comes from a different source. Also invalidate previous track to force a + // seek when resuming. + if (previousTrack->sessionId() != track->sessionId()) { + previousTrack->invalidate(); + } + } + } + mPreviousTrack = track; + // reset retry count track->mRetryCount = kMaxTrackRetriesDirect; mActiveTrack = t; @@ -4604,11 +4635,11 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::DirectOutputThread::prep } // if an active track did not command a flush, check for pending flush on stopped tracks - if (!flushPending) { + if (!mFlushPending) { for (size_t i = 0; i < mTracks.size(); i++) { if (mTracks[i]->isFlushPending()) { mTracks[i]->flushAck(); - flushPending = true; + mFlushPending = true; } } } @@ -4618,10 +4649,10 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::DirectOutputThread::prep // before flush and then resume HW. This can happen in case of pause/flush/resume // if resume is received before pause is executed. if (mHwSupportsPause && !mStandby && - (doHwPause || (flushPending && !mHwPaused && (count != 0)))) { + (doHwPause || (mFlushPending && !mHwPaused && (count != 0)))) { mOutput->stream->pause(mOutput->stream); } - if (flushPending) { + if (mFlushPending) { flushHw_l(); } if (mHwSupportsPause && !mStandby && doHwResume) { @@ -4680,14 +4711,13 @@ void AudioFlinger::DirectOutputThread::threadLoop_exit() { { Mutex::Autolock _l(mLock); - bool flushPending = false; for (size_t i = 0; i < mTracks.size(); i++) { if (mTracks[i]->isFlushPending()) { mTracks[i]->flushAck(); - flushPending = true; + mFlushPending = true; } } - if (flushPending) { + if (mFlushPending) { flushHw_l(); } } @@ -4825,6 +4855,7 @@ void AudioFlinger::DirectOutputThread::flushHw_l() { mOutput->flush(); mHwPaused = false; + mFlushPending = false; } // ---------------------------------------------------------------------------- @@ -5146,7 +5177,6 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::OffloadThread::prepareTr } if (mFlushPending) { flushHw_l(); - mFlushPending = false; } if (!mStandby && doHwResume) { mOutput->stream->resume(mOutput->stream); @@ -5194,18 +5224,6 @@ void AudioFlinger::OffloadThread::flushHw_l() } } -void AudioFlinger::OffloadThread::onAddNewTrack_l() -{ - sp<Track> previousTrack = mPreviousTrack.promote(); - sp<Track> latestTrack = mLatestActiveTrack.promote(); - - if (previousTrack != 0 && latestTrack != 0 && - (previousTrack->sessionId() != latestTrack->sessionId())) { - mFlushPending = true; - } - PlaybackThread::onAddNewTrack_l(); -} - // ---------------------------------------------------------------------------- AudioFlinger::DuplicatingThread::DuplicatingThread(const sp<AudioFlinger>& audioFlinger, diff --git a/services/audioflinger/Threads.h b/services/audioflinger/Threads.h index 7b4fb14..4ebe615 100644 --- a/services/audioflinger/Threads.h +++ b/services/audioflinger/Threads.h @@ -941,6 +941,8 @@ protected: virtual void threadLoop_exit(); virtual bool shouldStandby_l(); + virtual void onAddNewTrack_l(); + // volumes last sent to audio HAL with stream->set_volume() float mLeftVolFloat; float mRightVolFloat; @@ -952,6 +954,9 @@ protected: // prepareTracks_l() tells threadLoop_mix() the name of the single active track sp<Track> mActiveTrack; + + wp<Track> mPreviousTrack; // used to detect track switch + public: virtual bool hasFastMixer() const { return false; } }; @@ -971,12 +976,10 @@ protected: virtual bool waitingAsyncCallback(); virtual bool waitingAsyncCallback_l(); - virtual void onAddNewTrack_l(); private: size_t mPausedWriteLength; // length in bytes of write interrupted by pause size_t mPausedBytesRemaining; // bytes still waiting in mixbuffer after resume - wp<Track> mPreviousTrack; // used to detect track switch }; class AsyncCallbackThread : public Thread { diff --git a/services/audioflinger/Tracks.cpp b/services/audioflinger/Tracks.cpp index 1b03060..f7da209 100644 --- a/services/audioflinger/Tracks.cpp +++ b/services/audioflinger/Tracks.cpp @@ -1951,7 +1951,9 @@ AudioFlinger::RecordThread::RecordTrack::RecordTrack( ((buffer == NULL) ? ALLOC_LOCAL : ALLOC_NONE), type), mOverflow(false), - mFramesToDrop(0) + mFramesToDrop(0), + mResamplerBufferProvider(NULL), // initialize in case of early constructor exit + mRecordBufferConverter(NULL) { if (mCblk == NULL) { return; diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp index bded309..deebc23 100644 --- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp +++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp @@ -789,6 +789,11 @@ audio_io_handle_t AudioPolicyManager::getOutputForDevice( // only allow deep buffering for music stream type if (stream != AUDIO_STREAM_MUSIC) { flags = (audio_output_flags_t)(flags &~AUDIO_OUTPUT_FLAG_DEEP_BUFFER); + } else if (/* stream == AUDIO_STREAM_MUSIC && */ + flags == AUDIO_OUTPUT_FLAG_NONE && + property_get_bool("audio.deep_buffer.media", false /* default_value */)) { + // use DEEP_BUFFER as default output for music stream type + flags = (audio_output_flags_t)AUDIO_OUTPUT_FLAG_DEEP_BUFFER; } if (stream == AUDIO_STREAM_TTS) { flags = AUDIO_OUTPUT_FLAG_TTS; diff --git a/services/camera/libcameraservice/api2/CameraDeviceClient.h b/services/camera/libcameraservice/api2/CameraDeviceClient.h index 3bda70c..0f485ca 100644 --- a/services/camera/libcameraservice/api2/CameraDeviceClient.h +++ b/services/camera/libcameraservice/api2/CameraDeviceClient.h @@ -27,8 +27,7 @@ namespace android { -struct CameraDeviceClientBase : - public CameraService::BasicClient, public BnCameraDeviceUser +struct CameraDeviceClientBase : public CameraService::BasicClient, public BnCameraDeviceUser { typedef ICameraDeviceCallbacks TCamCallbacks; @@ -167,7 +166,7 @@ private: // Find the closest dimensions for a given format in available stream configurations with // a width <= ROUNDING_WIDTH_CAP - static const int32_t ROUNDING_WIDTH_CAP = 1080; + static const int32_t ROUNDING_WIDTH_CAP = 1920; static bool roundBufferDimensionNearest(int32_t width, int32_t height, int32_t format, android_dataspace dataSpace, const CameraMetadata& info, /*out*/int32_t* outWidth, /*out*/int32_t* outHeight); |