Home | History | Annotate | Download | only in audioflinger

Lines Matching full:track

121     FastMixer_Dynamic,  // initialize if needed, then use dynamically depending on track load,
136 // for the track. The client then sub-divides this into smaller buffers for its use.
1011 Track::appendDumpHeader(result);
1013 sp<Track> track = mTracks[i];
1014 if (track != 0) {
1015 track->dump(buffer, SIZE);
1022 Track::appendDumpHeader(result);
1024 sp<Track> track = mActiveTracks[i].promote();
1025 if (track != 0) {
1026 track->dump(buffer, SIZE);
1060 fdprintf(fd, "Fast track availMask=%#x\n", mFastTrackAvailMask);
1092 sp<AudioFlinger::PlaybackThread::Track> AudioFlinger::PlaybackThread::createTrack_l(
1105 sp<Track> track;
1139 // there are sufficient fast track slots available
1141 // FIXME test that MixerThread for this fast track has a capable output HAL
1207 sp<Track> t = mTracks[i];
1220 track = new Track(this, client, streamType, sampleRate, format,
1223 track = TimedTrack::create(this, client, streamType, sampleRate, format,
1226 if (track == 0 || track->getCblk() == NULL || track->name() < 0) {
1230 mTracks.add(track);
1235 track->setMainBuffer(chain->inBuffer());
1236 chain->setStrategy(AudioSystem::getStrategyForStream(track->streamType()));
1254 return track;
1319 status_t AudioFlinger::PlaybackThread::addTrack_l(const sp<Track>& track)
1324 track->mRetryCount = kMaxTrackStartupRetries;
1325 if (mActiveTracks.indexOf(track) < 0) {
1326 // the track is newly added, make sure it fills up all its
1329 track->mFillingUpStatus = Track::FS_FILLING;
1330 track->mResetDone = false;
1331 track->mPresentationCompleteFrames = 0;
1332 mActiveTracks.add(track);
1333 sp<EffectChain> chain = getEffectChain_l(track->sessionId());
1335 ALOGV("addTrack_l() starting track on chain %p for session %d", chain.get(),
1336 track->sessionId());
1350 void AudioFlinger::PlaybackThread::destroyTrack_l(const sp<Track>& track)
1352 track->mState = TrackBase::TERMINATED;
1354 if (mActiveTracks.indexOf(track) < 0) {
1355 removeTrack_l(track);
1359 void AudioFlinger::PlaybackThread::removeTrack_l(const sp<Track>& track)
1361 track->triggerEvents(AudioSystem::SYNC_EVENT_PRESENTATION_COMPLETE);
1362 mTracks.remove(track);
1363 deleteTrackName_l(track->name());
1364 // redundant as track is about to be destroyed, for dumpsys only
1365 track->mName = -1;
1366 if (track->isFastTrack()) {
1367 int index = track->mFastIndex;
1371 // redundant as track is about to be destroyed, for dumpsys only
1372 track->mFastIndex = -1;
1374 sp<EffectChain> chain = getEffectChain_l(track
1462 // track, but we sometimes have to do this to satisfy the maximum frame count
1528 sp<Track> track = mTracks[i];
1529 if (sessionId == track->sessionId() && !track->isInvalid()) {
1546 sp<Track> track = mTracks[i];
1547 if (sessionId == track->sessionId() && !track->isInvalid()) {
1548 return AudioSystem::getStrategyForStream(track->streamType());
1597 sp<Track> track = mTracks[i];
1598 if (event->triggerSession() == track->sessionId()) {
1599 (void) track->setSyncEvent(event);
1613 const Vector< sp<Track> >& tracksToRemove)
1618 const sp<Track>& track = tracksToRemove.itemAt(i);
1619 if ((track->sharedBuffer() != 0) &&
1620 (track->mState == TrackBase::ACTIVE || track->mState == TrackBase::RESUMING)) {
1621 AudioSystem::stopOutput(mId, track->streamType(), track->sessionId());
1722 sp<Track> t = mTracks[i];
1749 sp<Track> track = mTracks[i];
1750 if (session == track->sessionId()) {
1751 ALOGV("addEffectChain_l() track->setMainBuffer track %p buffer %p", track.get(),
1753 track->setMainBuffer(buffer);
1760 sp<Track> track = mActiveTracks[i].promote();
1761 if (track == 0) {
1764 if (session == track->sessionId()) {
1765 ALOGV("addEffectChain_l() activating track %p on session %d", track.get(), session);
1777 // after track specific effects and before output stage
1807 sp<Track> track = mActiveTracks[i].promote();
1808 if (track == 0) {
1811 if (session == track->sessionId()) {
1812 ALOGV("removeEffectChain_l(): stopping track on chain %p for session Id: %d",
1820 sp<Track> track = mTracks[i];
1821 if (session == track->sessionId()) {
1822 track->setMainBuffer(mMixBuffer);
1833 const sp<AudioFlinger::PlaybackThread::Track> track, int EffectId)
1836 return attachAuxEffect_l(track, EffectId);
1840 const sp<AudioFlinger::PlaybackThread::Track> track, int EffectId)
1845 track->setAuxBuffer(0, NULL);
1851 track->setAuxBuffer(EffectId, (int32_t *)effect->inBuffer());
1865 sp<Track> track = mTracks[i];
1866 if (track->auxEffectId() == effectId) {
1867 attachAuxEffect_l(track, 0);
1874 Vector< sp<Track> > tracksToRemove;
2024 // Finally let go of removed track(s), without the lock held
2135 // create fast mixer and configure it initially with just one fast track for our submix
2224 // We'll use that extract the final state which contains one remaining fast track
2256 void AudioFlinger::MixerThread::threadLoop_removeTracks(const Vector< sp<Track> >& tracksToRemove)
2391 Vector< sp<Track> > *tracksToRemove)
2429 sp<Track> t = mActiveTracks[i].promote();
2435 Track* const track = t.get();
2438 if (track->isFastTrack()) {
2440 // It's theoretically possible (though unlikely) for a fast track to be created
2442 // the track never becomes active so it's fast mixer slot is never touched.
2443 // The converse, of removing an (active) track and then creating a new track
2446 int j = track->mFastIndex;
2451 // Determine whether the track is currently in underrun condition,
2456 track->mObservedUnderruns.mBitFields.mFull) & UNDERRUN_MASK;
2458 track->mObservedUnderruns.mBitFields.mPartial) & UNDERRUN_MASK;
2460 track->mObservedUnderruns.mBitFields.mEmpty) & UNDERRUN_MASK;
2462 track->mObservedUnderruns = underruns;
2465 if (!(track->isStopping() || track->isPausing() || track->isStopped())) {
2466 track->mUnderrunCount += recentUnderruns;
2472 switch (track->mState) {
2474 // track stays active in STOPPING_1 state until first underrun
2476 track->mState = TrackBase::STOPPING_2;
2481 track->setPaused();
2485 track->mState = TrackBase::ACTIVE;
2489 // track has provided at least some frames recently: reset retry count
2490 track->mRetryCount = kMaxTrackRetries;
2497 if (track->sharedBuffer() == 0) {
2504 if (--(track->mRetryCount) > 0) {
2507 // indicate to client process that the track was disabled because of underrun;
2509 android_atomic_or(CBLK_DISABLED, &track->mCblk->flags);
2520 // Check for presentation complete if track is inactive
2521 // We have consumed all the buffers of this track.
2527 if (!(mStandby || track->presentationComplete(framesWritten, audioHALFrames))) {
2528 // track stays in active list until presentation is complete
2532 if (track->isStopping_2()) {
2533 track->mState = TrackBase::STOPPED;
2535 if (track->isStopped()) {
2536 // Can't reset directly, as fast mixer is still polling this track
2537 // track->reset();
2538 // So instead mark this track as needing to be reset after push with ack
2545 LOG_FATAL("unexpected track state %d", track->mState);
2551 ExtendedAudioBufferProvider *eabp = track;
2552 VolumeProvider *vp = track;
2555 fastTrack->mSampleRate = track->mSampleRate;
2556 fastTrack->mChannelMask = track->mChannelMask;
2564 track->mCachedVolume = masterVolume * mStreamTypes[track->streamType()].volume;
2577 LOG_FATAL("fast track %d should have been active", j);
2579 tracksToRemove->add(track);
2581 track->mObservedUnderruns.mBitFields.mMostRecent = UNDERRUN_FULL;
2588 audio_track_cblk_t* cblk = track->cblk();
2590 // The first time a track is added we wait
2592 int name = track->name();
2596 // hence the test on (mMixerStatus == MIXER_TRACKS_READY) meaning the track was mixed
2599 if ((track->sharedBuffer() == 0) && !track->isStopped() && !track->isPausing() &&
2608 minFrames += mAudioMixer->getUnreleasedFrames(track->name());
2609 // the minimum track buffer size is normally twice the number of frames necessary
2615 if ((track->framesReady() >= minFrames) && track->isReady() &&
2616 !track->isPaused() && !track->isTerminated())
2618 ALOGVV("track %d u=%08x, s=%08x [OK] on thread %p", name, cblk->user, cblk->server,
2623 // track->mainBuffer() != mMixBuffer means there is an effect chain
2624 // connected to the track
2626 if (track->mainBuffer() != mMixBuffer) {
2627 chain = getEffectChain_l(track->sessionId());
2628 // Delegate volume control to effect in track effect chain if needed
2632 ALOGW("prepareTracks_l(): track %d attached to effect but no chain found on "
2634 name, track->sessionId());
2640 if (track->mFillingUpStatus == Track::FS_FILLED) {
2642 track->mFillingUpStatus = Track::FS_ACTIVE;
2643 if (track->mState == TrackBase::RESUMING) {
2644 track->mState = TrackBase::ACTIVE;
2649 // If the track is stopped before the first frame was mixed,
2654 // compute volume for this track
2656 if (track->isPausing() || mStreamTypes[track->streamType()].mute) {
2658 if (track
2659 track->setPaused();
2664 float typeVolume = mStreamTypes[track->streamType()].volume;
2666 ServerProxy *proxy = track->mServerProxy;
2670 // track volumes come from shared memory, so can't be trusted and must be clamped
2672 ALOGV("Track left volume out of range: %04X", vl);
2676 ALOGV("Track right volume out of range: %04X", vr);
2688 ALOGV("Track send level out of range: %04X", sendLevel);
2693 // Delegate volume control to effect in track effect chain if needed
2697 track->mHasVolumeController = true;
2701 if (track->mHasVolumeController) {
2704 track->mHasVolumeController = false;
2723 mAudioMixer->setBufferProvider(name, track);
2731 AudioMixer::TRACK,
2732 AudioMixer::FORMAT, (void *)track->format());
2735 AudioMixer::TRACK,
2736 AudioMixer::CHANNEL_MASK, (void *)track->channelMask());
2737 // limit track sample rate to 2 x output sample rate, which changes at re-configuration
2739 uint32_t reqSampleRate = track->mServerProxy->getSampleRate();
2752 AudioMixer::TRACK,
2753 AudioMixer::MAIN_BUFFER, (void *)track->mainBuffer());
2756 AudioMixer::TRACK,
2757 AudioMixer::AUX_BUFFER, (void *)track->auxBuffer());
2760 track->mRetryCount = kMaxTrackRetries;
2762 // If one track is ready, set the mixer ready if:
2764 // - no other track is not ready
2770 // clear effect chain input buffer if an active track underruns to avoid sending
2772 chain = getEffectChain_l(track->sessionId());
2777 ALOGVV("track %d u=%08x, s=%08x [NOT READY] on thread %p", name, cblk->user,
2779 if ((track->sharedBuffer() != 0) || track->isTerminated() ||
2780 track->isStopped() || track->isPaused()) {
2781 // We have consumed all the buffers of this track.
2787 if (mStandby || track->presentationComplete(framesWritten, audioHALFrames)) {
2788 if (track->isStopped()) {
2789 track->reset();
2791 tracksToRemove->add(track);
2794 track->mUnderrunCount++;
2795 // No buffers for this track. Give it a few chances to
2797 if (--(track->mRetryCount) <= 0) {
2799 tracksToRemove->add(track);
2800 // indicate to client process that the track was disabled because of underrun;
2803 // If one track is not ready, mark the mixer also not ready if:
2805 // - no other track is ready
2854 sp<Track> t = mActiveTracks[i].promote();
2858 Track* track = t.get();
2859 ALOG_ASSERT(track->isFastTrack() && track->isStopped());
2860 track->reset();
2867 const sp<Track>& track = tracksToRemove->itemAt(i);
2868 mActiveTracks.remove(track);
2869 if (track->mainBuffer() != mMixBuffer) {
2870 chain = getEffectChain_l(track->sessionId());
2872 ALOGV("stopping track on chain %p for session Id: %d", chain.get(),
2873 track->sessionId());
2877 if (track->isTerminated()) {
2878 removeTrack_l(track);
2885 // mix buffer and track effects will accumulate into it
2909 ALOGV("remove track (%d) and delete from mixer", name);
2958 // do not accept frame count changes if tracks are open as the track buffer
2960 // if frame count is changed after track creation
3124 Vector< sp<Track> > *tracksToRemove
3132 sp<Track> t = mActiveTracks[i].promote();
3133 // The track died recently
3138 Track* const track = t.get();
3139 audio_track_cblk_t* cblk = track->cblk();
3141 // The first time a track is added we wait
3144 if ((track->sharedBuffer() == 0) && !track->isStopped() && !track->isPausing()) {
3149 if ((track->framesReady() >= minFrames) && track->isReady() &&
3150 !track->isPaused() && !track->isTerminated())
3152 ALOGVV("track %d u=%08x, s=%08x [OK]", track->name(), cblk->user, cblk->server);
3154 if (track->mFillingUpStatus == Track::FS_FILLED) {
3155 track->mFillingUpStatus = Track::FS_ACTIVE;
3157 if (track->mState == TrackBase::RESUMING) {
3158 track->mState = TrackBase::ACTIVE;
3162 // compute volume for this track
3164 if (mMasterMute || track->isPausing() || mStreamTypes[track->streamType()].mute) {
3166 if (track->isPausing()) {
3167 track->setPaused();
3170 float typeVolume = mStreamTypes[track->streamType()].volume;
3172 uint32_t vlr = track->mServerProxy->getVolumeLR();
3184 // Only consider last track started for volume and mixer state control.
3185 // This is the last entry in mActiveTracks unless a track underruns.
3197 // Delegate volume control to effect in track effect chain if needed
3199 // there is one, the track is connected to it
3210 track->mRetryCount = kMaxTrackRetriesDirect;
3215 // clear effect chain input buffer if the last active track started underruns
3221 ALOGVV("track %d u=%08x, s=%08x [NOT READY]", track->name(), cblk->user, cblk->server);
3222 if ((track->sharedBuffer() != 0) || track->isTerminated() ||
3223 track->isStopped() || track->isPaused()) {
3224 // We have consumed all the buffers of this track.
3229 if (mStandby || track->presentationComplete(framesWritten, audioHALFrames)) {
3230 if (track->isStopped()) {
3231 track->reset();
3233 tracksToRemove->add(track);
3236 // No buffers for this track. Give it a few chances to
3238 // Only consider last track started for mixer state control
3239 if (--(track->mRetryCount) <= 0) {
3240 ALOGV("BUFFER TIMEOUT: remove(%d) from active list", track->name());
3241 tracksToRemove->add(track);
3253 const sp<Track>& track = tracksToRemove->itemAt(i);
3254 mActiveTracks.remove(track);
3256 ALOGV("stopping track on chain %p for session Id: %d", mEffectChains[0].get(),
3257 track->sessionId());
3260 if (track->isTerminated()) {
3261 removeTrack_l(track);
3331 // do not accept frame count changes if tracks are open as the track buffer
3333 // if frame count is changed after track creation
3500 ALOGV("addOutputTrack() track %p, on thread %p", outputTrack, thread);
3541 ALOGW("DuplicatingThread::outputsReady() could not promote thread on output track %p",
3548 ALOGV("DuplicatingThread output track %p on thread %p Not Ready", outputTracks[i].get(),
3863 sp<RecordTrack> track;
3877 track = new RecordTrack(this, client, sampleRate,
3880 if (track->getCblk() == 0) {
3884 mTracks.add(track);
3898 return track;
3917 // Sync event can be cancelled by the trigger session if the track is not in a
4043 sp<RecordTrack> track = mTracks[i];
4044 if (eventSession == track->sessionId()) {
4045 (void) track->setSyncEvent(event);
4056 void AudioFlinger::RecordThread::destroyTrack_l(const sp<RecordTrack>& track)
4058 track->mState = TrackBase::TERMINATED;
4060 if (mActiveTrack != track) {
4061 removeTrack_l(track);
4065 void AudioFlinger::RecordThread::removeTrack_l(const sp<RecordTrack>& track)
4067 mTracks.remove(track);
4117 sp<RecordTrack> track = mTracks[i];
4118 if (track != 0) {
4119 track->dump(buffer, SIZE);
4207 // do not accept frame count changes if tracks are open as the track buffer
4209 // if frame count is changed after track creation
4237 sp<RecordTrack> track = mTracks[i];
4238 setEffectSuspended_l(FX_IID_AEC, suspend, track->sessionId());
4239 setEffectSuspended_l(FX_IID_NS, suspend, track->sessionId());
4405 sp<RecordThread::RecordTrack> track = mTracks[j];
4406 int sessionId = track->sessionId();