Home | History | Annotate | Download | only in audioflinger

Lines Matching refs:Track

294     sp<PlaybackThread::Track> track;
337 // check if an effect with same session ID is waiting for a track to be created
353 track = thread->createTrack_l(client, streamType, sampleRate, format,
357 // for a track to be created
365 trackHandle = new TrackHandle(track);
367 // remove local strong reference to Client before deleting the Track so that the Client
370 track.clear();
1038 sp<Track> track = mTracks[i];
1039 if (track != 0) {
1040 track->dump(buffer, SIZE);
1049 wp<Track> wTrack = mActiveTracks[i];
1051 sp<Track> track = wTrack.promote();
1052 if (track != 0) {
1053 track->dump(buffer, SIZE);
1129 sp<AudioFlinger::PlaybackThread::Track> AudioFlinger::PlaybackThread::createTrack_l(
1140 sp<Track> track;
1174 sp<Track> t = mTracks[i];
1184 track = new Track(this, client, streamType, sampleRate, format,
1186 if (track->getCblk() == NULL || track->name() < 0) {
1190 mTracks.add(track);
1195 track->setMainBuffer(chain->inBuffer());
1196 chain->setStrategy(AudioSystem::getStrategyForStream((AudioSystem::stream_type)track->type()));
1205 return track;
1291 sp<Track> t = mActiveTracks[i].promote();
1293 Track* const track = t.get();
1301 status_t AudioFlinger::PlaybackThread::addTrack_l(const sp<Track>& track)
1306 track->mRetryCount = kMaxTrackStartupRetries;
1307 if (mActiveTracks.indexOf(track) < 0) {
1308 // the track is newly added, make sure it fills up all its
1311 track->mFillingUpStatus = Track::FS_FILLING;
1312 track->mResetDone = false;
1313 mActiveTracks.add(track);
1314 if (track->mainBuffer() != mMixBuffer) {
1315 sp<EffectChain> chain = getEffectChain_l(track->sessionId());
1317 LOGV("addTrack_l() starting track on chain %p for session %d", chain.get(), track->sessionId());
1332 void AudioFlinger::PlaybackThread::destroyTrack_l(const sp<Track>& track)
1334 track->mState = TrackBase::TERMINATED;
1335 if (mActiveTracks.indexOf(track) < 0) {
1336 mTracks.remove(track);
1337 deleteTrackName_l(track->name());
1422 sp<Track> track = mTracks[i];
1423 if (sessionId == track->sessionId() &&
1424 !(track->mCblk->flags & CBLK_INVALID_MSK)) {
1441 sp<Track> track = mTracks[i];
1442 if (sessionId == track->sessionId() &&
1443 !(track->mCblk->flags & CBLK_INVALID_MSK)) {
1444 return AudioSystem::getStrategyForStream((AudioSystem::stream_type) track->type());
1501 Vector< sp<Track> > tracksToRemove;
1533 const SortedVector< wp<Track> >& activeTracks = mActiveTracks;
1666 uint32_t AudioFlinger::MixerThread::prepareTracks_l(const SortedVector< wp<Track> >& activeTracks, Vector< sp<Track> > *tracksToRemove)
1690 sp<Track> t = activeTracks[i].promote();
1692 Track* const track = t.get();
1693 int iTracktype=track->type();
1694 activeTypes |= 1<<track->type();
1709 sp<Track> t = activeTracks[i].promote();
1712 Track* const track = t.get();
1713 audio_track_cblk_t* cblk = track->cblk();
1715 // The first time a track is added we wait
1717 mAudioMixer->setActiveTrack(track->name());
1718 if (cblk->framesReady() && track->isReady() &&
1719 !track->isPaused() && !track->isTerminated())
1721 //LOGV("track %d u=%08x, s=%08x [OK] on thread %p", track->name(), cblk->user, cblk->server, this);
1725 // track->mainBuffer() != mMixBuffer means there is an effect chain
1726 // connected to the track
1728 if (track->mainBuffer() != mMixBuffer) {
1729 chain = getEffectChain_l(track->sessionId());
1730 // Delegate volume control to effect in track effect chain if needed
1734 LOGW("prepareTracks_l(): track %08x attached to effect but no chain found on session %d",
1735 track->name(), track->sessionId());
1741 if (track->mFillingUpStatus == Track::FS_FILLED) {
1743 track->mFillingUpStatus = Track::FS_ACTIVE;
1744 if (track->mState == TrackBase::RESUMING) {
1745 track->mState = TrackBase::ACTIVE;
1749 // If the track is stopped before the first frame was mixed,
1754 // compute volume for this track
1756 if (track->isMuted() || track->isPausing() ||
1757 mStreamTypes[track->type()].mute) {
1759 if (track->isPausing()) {
1760 track->setPaused();
1765 float typeVolume = mStreamTypes[track->type()].volume;
1771 LifeVibes::getStreamVolumes(audioOutputType, track->type(), &typeVolume, &streamMute);
1783 // Delegate volume control to effect in track effect chain if needed
1787 track->mHasVolumeController = true;
1791 if (track->mHasVolumeController) {
1794 track->mHasVolumeController = false;
1818 mAudioMixer->setBufferProvider(track);
1825 AudioMixer::TRACK,
1826 AudioMixer::FORMAT, (void *)track->format());
1828 AudioMixer::TRACK,
1829 AudioMixer::CHANNEL_COUNT, (void *)track->channelCount());
1835 AudioMixer::TRACK,
1836 AudioMixer::MAIN_BUFFER, (void *)track->mainBuffer());
1838 AudioMixer::TRACK,
1839 AudioMixer::AUX_BUFFER, (void *)track->auxBuffer());
1842 track->mRetryCount = kMaxTrackRetries;
1845 //LOGV("track %d u=%08x, s=%08x [NOT READY] on thread %p", track->name(), cblk->user, cblk->server, this);
1846 if (track->isStopped()) {
1847 track->reset();
1849 if (track->isTerminated() || track->isStopped() || track->isPaused()) {
1850 // We have consumed all the buffers of this track.
1852 tracksToRemove->add(track);
1854 // No buffers for this track. Give it a few chances to
1856 if (--(track->mRetryCount) <= 0) {
1857 LOGV("BUFFER TIMEOUT: remove(%d) from active list on thread %p", track->name(), this);
1858 tracksToRemove->add(track);
1859 // indicate to client process that the track was disabled because of underrun
1873 const sp<Track>& track = tracksToRemove->itemAt(i);
1874 mActiveTracks.remove(track);
1875 if (track->mainBuffer() != mMixBuffer) {
1876 chain = getEffectChain_l(track->sessionId());
1878 LOGV("stopping track on chain %p for session Id: %d", chain.get(), track->sessionId());
1882 if (track->isTerminated()) {
1883 mTracks.remove(track);
1884 deleteTrackName_l(track->mName);
1891 // mix buffer and track effects will accumulate into it
1907 sp<Track> t = mTracks[i];
1927 LOGV("remove track (%d) and delete from mixer", name);
1960 // do not accept frame count changes if tracks are open as the track buffer
1962 // if frame count is changed after track creation
1994 // limit track sample rate to 2 x new output sample rate
2152 sp<Track> trackToRemove;
2153 sp<Track> activeTrack;
2226 sp<Track> t = mActiveTracks[0].promote();
2229 Track* const track = t.get();
2230 audio_track_cblk_t* cblk = track->cblk();
2232 // The first time a track is added we wait
2234 if (cblk->framesReady() && track->isReady() &&
2235 !track->isPaused() && !track->isTerminated())
2237 //LOGV("track %d u=%08x, s=%08x [OK]", track->name(), cblk->user, cblk->server);
2239 if (track->mFillingUpStatus == Track::FS_FILLED) {
2240 track->mFillingUpStatus = Track::FS_ACTIVE;
2243 if (track->mState == TrackBase::RESUMING) {
2244 track->mState = TrackBase::ACTIVE;
2248 // If the track is stopped before the first frame was mixed,
2252 // compute volume for this track
2254 if (track->isMuted() || mMasterMute || track->isPausing() ||
2255 mStreamTypes[track->type()].mute) {
2257 if (track->isPausing()) {
2258 track->setPaused();
2261 float typeVolume = mStreamTypes[track->type()].volume;
2286 // Delegate volume control to effect in track effect chain if needed
2288 // there is one, the track is connected to it
2310 track->mRetryCount = kMaxTrackRetriesDirect;
2314 //LOGV("track %d u=%08x, s=%08x [NOT READY]", track->name(), cblk->user, cblk->server);
2315 if (track->isStopped()) {
2316 track->reset();
2318 if (track->isTerminated() || track->isStopped() || track->isPaused()) {
2319 // We have consumed all the buffers of this track.
2321 trackToRemove = track;
2323 // No buffers for this track. Give it a few chances to
2325 if (--(track->mRetryCount) <= 0) {
2326 LOGV("BUFFER TIMEOUT: remove(%d) from active list", track->name());
2327 trackToRemove = track;
2339 LOGV("stopping track on chain %p for session Id: %d", effectChains[0].get(),
2410 // finally let go of removed track, without the lock held
2452 // do not accept frame count changes if tracks are open as the track buffer
2454 // if frame count is changed after track creation
2537 Vector< sp<Track> > tracksToRemove;
2564 const SortedVector< wp<Track> >& activeTracks = mActiveTracks;
2692 LOGV("addOutputTrack() track %p, on thread %p", outputTrack, thread);
2731 LOGW("DuplicatingThread::outputsReady() could not promote thread on output track %p", outputTracks[i].get());
2736 LOGV("DuplicatingThread output track %p on thread %p Not Ready", outputTracks[i].get(), thread.get());
2774 // LOGD("Creating track with %d buffers @ %d bytes", bufferCount, bufferSize);
2889 // Check validity of returned pointer in case the track control block would have been corrupted.
2904 // Track constructor must be called with AudioFlinger::mLock and ThreadBase::mLock held
2905 AudioFlinger::PlaybackThread::Track::Track(
2926 LOGV("Track
2928 LOGE("no more track names available");
2939 AudioFlinger::PlaybackThread::Track::~Track()
2941 LOGV("PlaybackThread::Track destructor");
2949 void AudioFlinger::PlaybackThread::Track::destroy()
2951 // NOTE: destroyTrack_l() can remove a strong reference to this Track
2954 // we must acquire a strong reference on this Track before locking mLock
2956 // On the other hand, as long as Track::destroy() is only called by
2958 // this Track with its member mTrack.
2959 sp<Track> keep(this);
2978 void AudioFlinger::PlaybackThread::Track::dump(char* buffer, size_t size)
3000 status_t AudioFlinger::PlaybackThread::Track::getNextBuffer(AudioBufferProvider::Buffer* buffer)
3037 LOGV("getNextBuffer() no more data for track %d on thread %p", mName, mThread.unsafe_get());
3041 bool AudioFlinger::PlaybackThread::Track::isReady() const {
3053 status_t AudioFlinger::PlaybackThread::Track::start()
3062 // here the track could be either new, or restarted
3063 // in both cases "unstop" the track
3091 void AudioFlinger::PlaybackThread::Track::stop()
3100 // If the track is not active (PAUSED and buffers full), flush buffers
3117 void AudioFlinger::PlaybackThread::Track::pause()
3137 void AudioFlinger::PlaybackThread::Track::flush()
3161 void AudioFlinger::PlaybackThread::Track::reset()
3164 // the audioflinger thread detects the track is stopped.
3176 void AudioFlinger::PlaybackThread::Track::mute(bool muted)
3181 void AudioFlinger::PlaybackThread::Track::setVolume(float left, float right)
3187 status_t AudioFlinger::PlaybackThread::Track::attachAuxEffect(int EffectId)
3198 void AudioFlinger::PlaybackThread::Track::setAuxBuffer(int EffectId, int32_t *buffer)
3327 : Track(thread, NULL, AudioSystem::NUM_STREAM_TYPES, sampleRate, format, channelCount, frameCount, NULL, 0),
3341 LOGW("Error creating output track on thread %p", playbackThread);
3352 status_t status = Track::start();
3364 Track::stop();
3469 // If no more buffers are pending, fill output track buffer to make sure it is started
3600 AudioFlinger::TrackHandle::TrackHandle(const sp<AudioFlinger::PlaybackThread::Track>& track)
3602 mTrack(track)
3607 // just stop the track on deletion, associated resources
3609 // been played. Unless it's not in the active track list, in which
3707 // create new record track. The record track uses one track in mHardwareMixerThread by convention.
4053 result.append("Active Track:\n");
4150 // do not accept frame count changes if tracks are open as the track buffer
4152 // if frame count is changed after track creation
4783 // thread when a track with the same session ID is created
4919 sp<Track> track;
5109 sp<Track> track = mTracks[i];
5110 if (session == track->sessionId()) {
5111 LOGV("addEffectChain_l() track->setMainBuffer track %p buffer %p", track.get(), buffer);
5112 track->setMainBuffer(buffer);
5118 sp<Track> track = mActiveTracks[i].promote();
5119 if (track == 0) continue;
5120 if (session == track->sessionId()) {
5121 LOGV("addEffectChain_l() activating track %p on session %d", track.get(), session);
5133 // after track specific effects and before output stage
5160 sp<Track> track = mTracks[i];
5161 if (session == track->sessionId()) {
5162 track->setMainBuffer(mMixBuffer);
5201 const sp<AudioFlinger::PlaybackThread::Track> track, int EffectId)
5204 return attachAuxEffect_l(track, EffectId);
5208 const sp<AudioFlinger::PlaybackThread::Track> track, int EffectId)
5213 track->setAuxBuffer(0, NULL);
5219 track->setAuxBuffer(EffectId, (int32_t *)effect->inBuffer());
5233 sp<Track> track = mTracks[i];
5234 if (track->auxEffectId() == effectId) {
5235 attachAuxEffect_l(track, 0);
5475 // TODO: handle configuration of effects replacing track process
6184 // do not process effect if no track is present in same audio session
6193 // if no track is active, input buffer must be cleared here as the mixer process
6234 // after track and auxiliary effects.