1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-25 16:48:44 +02:00

std::vector for wave track pointers; remove deprecated TrackList function; ...

... and some more uses of const
This commit is contained in:
Paul Licameli 2016-02-26 18:10:45 -05:00
parent af7cb40975
commit 43790cfa56
20 changed files with 173 additions and 190 deletions

View File

@ -1562,7 +1562,7 @@ int AudioIO::StartStream(WaveTrackArray playbackTracks,
double minScrubStutter = options.minScrubStutter; double minScrubStutter = options.minScrubStutter;
if (scrubbing) if (scrubbing)
{ {
if (mCaptureTracks->GetCount() > 0 || if (mCaptureTracks->size() > 0 ||
mPlayMode == PLAY_LOOPED || mPlayMode == PLAY_LOOPED ||
mTimeTrack != NULL || mTimeTrack != NULL ||
options.maxScrubSpeed < GetMinScrubSpeed()) options.maxScrubSpeed < GetMinScrubSpeed())
@ -1624,23 +1624,23 @@ int AudioIO::StartStream(WaveTrackArray playbackTracks,
// Capacity of the playback buffer. // Capacity of the playback buffer.
mPlaybackRingBufferSecs = 10.0; mPlaybackRingBufferSecs = 10.0;
mCaptureRingBufferSecs = 4.5 + 0.5 * std::min(size_t(16), mCaptureTracks->GetCount()); mCaptureRingBufferSecs = 4.5 + 0.5 * std::min(size_t(16), mCaptureTracks->size());
mMinCaptureSecsToCopy = 0.2 + 0.2 * std::min(size_t(16), mCaptureTracks->GetCount()); mMinCaptureSecsToCopy = 0.2 + 0.2 * std::min(size_t(16), mCaptureTracks->size());
unsigned int playbackChannels = 0; unsigned int playbackChannels = 0;
unsigned int captureChannels = 0; unsigned int captureChannels = 0;
sampleFormat captureFormat = floatSample; sampleFormat captureFormat = floatSample;
if( playbackTracks.GetCount() > 0 ) if( playbackTracks.size() > 0 )
playbackChannels = 2; playbackChannels = 2;
if (mSoftwarePlaythrough) if (mSoftwarePlaythrough)
playbackChannels = 2; playbackChannels = 2;
if( captureTracks.GetCount() > 0 ) if( captureTracks.size() > 0 )
{ {
// For capture, every input channel gets its own track // For capture, every input channel gets its own track
captureChannels = mCaptureTracks->GetCount(); captureChannels = mCaptureTracks->size();
// I don't deal with the possibility of the capture tracks // I don't deal with the possibility of the capture tracks
// having different sample formats, since it will never happen // having different sample formats, since it will never happen
// with the current code. This code wouldn't *break* if this // with the current code. This code wouldn't *break* if this
@ -1710,12 +1710,12 @@ int AudioIO::StartStream(WaveTrackArray playbackTracks,
return 0; return 0;
} }
mPlaybackBuffers = new RingBuffer* [mPlaybackTracks->GetCount()]; mPlaybackBuffers = new RingBuffer* [mPlaybackTracks->size()];
mPlaybackMixers = new Mixer* [mPlaybackTracks->GetCount()]; mPlaybackMixers = new Mixer* [mPlaybackTracks->size()];
// Set everything to zero in case we have to DELETE these due to a memory exception. // Set everything to zero in case we have to DELETE these due to a memory exception.
memset(mPlaybackBuffers, 0, sizeof(RingBuffer*)*mPlaybackTracks->GetCount()); memset(mPlaybackBuffers, 0, sizeof(RingBuffer*)*mPlaybackTracks->size());
memset(mPlaybackMixers, 0, sizeof(Mixer*)*mPlaybackTracks->GetCount()); memset(mPlaybackMixers, 0, sizeof(Mixer*)*mPlaybackTracks->size());
const Mixer::WarpOptions &warpOptions = const Mixer::WarpOptions &warpOptions =
#ifdef EXPERIMENTAL_SCRUBBING_SUPPORT #ifdef EXPERIMENTAL_SCRUBBING_SUPPORT
@ -1723,12 +1723,12 @@ int AudioIO::StartStream(WaveTrackArray playbackTracks,
#endif #endif
Mixer::WarpOptions(mTimeTrack); Mixer::WarpOptions(mTimeTrack);
for (unsigned int i = 0; i < mPlaybackTracks->GetCount(); i++) for (unsigned int i = 0; i < mPlaybackTracks->size(); i++)
{ {
mPlaybackBuffers[i] = new RingBuffer(floatSample, playbackBufferSize); mPlaybackBuffers[i] = new RingBuffer(floatSample, playbackBufferSize);
// MB: use normal time for the end time, not warped time! // MB: use normal time for the end time, not warped time!
mPlaybackMixers[i] = new Mixer(1, &(*mPlaybackTracks)[i], mPlaybackMixers[i] = new Mixer(WaveTrackConstArray{ (*mPlaybackTracks)[i] },
warpOptions, warpOptions,
mT0, mT1, 1, mT0, mT1, 1,
playbackMixBufferSize, false, playbackMixBufferSize, false,
@ -1752,15 +1752,15 @@ int AudioIO::StartStream(WaveTrackArray playbackTracks,
return 0; return 0;
} }
mCaptureBuffers = new RingBuffer* [mCaptureTracks->GetCount()]; mCaptureBuffers = new RingBuffer* [mCaptureTracks->size()];
mResample = new Resample* [mCaptureTracks->GetCount()]; mResample = new Resample* [mCaptureTracks->size()];
mFactor = sampleRate / mRate; mFactor = sampleRate / mRate;
// Set everything to zero in case we have to DELETE these due to a memory exception. // Set everything to zero in case we have to DELETE these due to a memory exception.
memset(mCaptureBuffers, 0, sizeof(RingBuffer*)*mCaptureTracks->GetCount()); memset(mCaptureBuffers, 0, sizeof(RingBuffer*)*mCaptureTracks->size());
memset(mResample, 0, sizeof(Resample*)*mCaptureTracks->GetCount()); memset(mResample, 0, sizeof(Resample*)*mCaptureTracks->size());
for( unsigned int i = 0; i < mCaptureTracks->GetCount(); i++ ) for( unsigned int i = 0; i < mCaptureTracks->size(); i++ )
{ {
mCaptureBuffers[i] = new RingBuffer( (*mCaptureTracks)[i]->GetSampleFormat(), mCaptureBuffers[i] = new RingBuffer( (*mCaptureTracks)[i]->GetSampleFormat(),
captureBufferSize ); captureBufferSize );
@ -1790,7 +1790,7 @@ int AudioIO::StartStream(WaveTrackArray playbackTracks,
// group determination should mimic what is done in audacityAudioCallback() // group determination should mimic what is done in audacityAudioCallback()
// when calling RealtimeProcess(). // when calling RealtimeProcess().
int group = 0; int group = 0;
for (size_t i = 0, cnt = mPlaybackTracks->GetCount(); i < cnt; i++) for (size_t i = 0, cnt = mPlaybackTracks->size(); i < cnt; i++)
{ {
WaveTrack *vt = (*gAudioIO->mPlaybackTracks)[i]; WaveTrack *vt = (*gAudioIO->mPlaybackTracks)[i];
@ -1814,7 +1814,7 @@ int AudioIO::StartStream(WaveTrackArray playbackTracks,
// Calculate the NEW time position // Calculate the NEW time position
mTime = std::max(mT0, std::min(mT1, *options.pStartTime)); mTime = std::max(mT0, std::min(mT1, *options.pStartTime));
// Reset mixer positions for all playback tracks // Reset mixer positions for all playback tracks
unsigned numMixers = mPlaybackTracks->GetCount(); unsigned numMixers = mPlaybackTracks->size();
for (unsigned ii = 0; ii < numMixers; ++ii) for (unsigned ii = 0; ii < numMixers; ++ii)
mPlaybackMixers[ii]->Reposition(mTime); mPlaybackMixers[ii]->Reposition(mTime);
if(mTimeTrack) if(mTimeTrack)
@ -1918,7 +1918,7 @@ void AudioIO::StartStreamCleanup(bool bOnlyBuffers)
if(mPlaybackBuffers) if(mPlaybackBuffers)
{ {
for( unsigned int i = 0; i < mPlaybackTracks->GetCount(); i++ ) for (unsigned int i = 0; i < mPlaybackTracks->size(); i++)
delete mPlaybackBuffers[i]; delete mPlaybackBuffers[i];
delete [] mPlaybackBuffers; delete [] mPlaybackBuffers;
mPlaybackBuffers = NULL; mPlaybackBuffers = NULL;
@ -1926,7 +1926,7 @@ void AudioIO::StartStreamCleanup(bool bOnlyBuffers)
if(mPlaybackMixers) if(mPlaybackMixers)
{ {
for( unsigned int i = 0; i < mPlaybackTracks->GetCount(); i++ ) for (unsigned int i = 0; i < mPlaybackTracks->size(); i++)
delete mPlaybackMixers[i]; delete mPlaybackMixers[i];
delete [] mPlaybackMixers; delete [] mPlaybackMixers;
mPlaybackMixers = NULL; mPlaybackMixers = NULL;
@ -1934,7 +1934,7 @@ void AudioIO::StartStreamCleanup(bool bOnlyBuffers)
if(mCaptureBuffers) if(mCaptureBuffers)
{ {
for( unsigned int i = 0; i < mCaptureTracks->GetCount(); i++ ) for (unsigned int i = 0; i < mCaptureTracks->size(); i++)
delete mCaptureBuffers[i]; delete mCaptureBuffers[i];
delete [] mCaptureBuffers; delete [] mCaptureBuffers;
mCaptureBuffers = NULL; mCaptureBuffers = NULL;
@ -1942,7 +1942,7 @@ void AudioIO::StartStreamCleanup(bool bOnlyBuffers)
if(mResample) if(mResample)
{ {
for( unsigned int i = 0; i < mCaptureTracks->GetCount(); i++ ) for (unsigned int i = 0; i < mCaptureTracks->size(); i++)
delete mResample[i]; delete mResample[i];
delete [] mResample; delete [] mResample;
mResample = NULL; mResample = NULL;
@ -2267,9 +2267,9 @@ void AudioIO::StopStream()
// we allocated in StartStream() // we allocated in StartStream()
// //
if( mPlaybackTracks->GetCount() > 0 ) if (mPlaybackTracks->size() > 0)
{ {
for( unsigned int i = 0; i < mPlaybackTracks->GetCount(); i++ ) for (unsigned int i = 0; i < mPlaybackTracks->size(); i++)
{ {
delete mPlaybackBuffers[i]; delete mPlaybackBuffers[i];
delete mPlaybackMixers[i]; delete mPlaybackMixers[i];
@ -2282,7 +2282,7 @@ void AudioIO::StopStream()
// //
// Offset all recorded tracks to account for latency // Offset all recorded tracks to account for latency
// //
if( mCaptureTracks->GetCount() > 0 ) if (mCaptureTracks->size() > 0)
{ {
// //
// We only apply latency correction when we actually played back // We only apply latency correction when we actually played back
@ -2297,7 +2297,7 @@ void AudioIO::StopStream()
double recordingOffset = double recordingOffset =
mLastRecordingOffset + latencyCorrection / 1000.0; mLastRecordingOffset + latencyCorrection / 1000.0;
for( unsigned int i = 0; i < mCaptureTracks->GetCount(); i++ ) for (unsigned int i = 0; i < mCaptureTracks->size(); i++)
{ {
delete mCaptureBuffers[i]; delete mCaptureBuffers[i];
delete mResample[i]; delete mResample[i];
@ -2305,14 +2305,14 @@ void AudioIO::StopStream()
WaveTrack* track = (*mCaptureTracks)[i]; WaveTrack* track = (*mCaptureTracks)[i];
track->Flush(); track->Flush();
if (mPlaybackTracks->GetCount() > 0) if (mPlaybackTracks->size() > 0)
{ // only do latency correction if some tracks are being played back { // only do latency correction if some tracks are being played back
WaveTrackArray playbackTracks; WaveTrackArray playbackTracks;
AudacityProject *p = GetActiveProject(); AudacityProject *p = GetActiveProject();
// we need to get this as mPlaybackTracks does not contain tracks being recorded into // we need to get this as mPlaybackTracks does not contain tracks being recorded into
playbackTracks = p->GetTracks()->GetWaveTrackArray(false); playbackTracks = p->GetTracks()->GetWaveTrackArray(false);
bool appendRecord = false; bool appendRecord = false;
for( unsigned int j = 0; j < playbackTracks.GetCount(); j++) for (unsigned int j = 0; j < playbackTracks.size(); j++)
{ // find if we are recording into an existing track (append-record) { // find if we are recording into an existing track (append-record)
WaveTrack* trackP = playbackTracks[j]; WaveTrack* trackP = playbackTracks[j];
if( track == trackP ) if( track == trackP )
@ -2873,7 +2873,7 @@ int AudioIO::GetCommonlyAvailPlayback()
int commonlyAvail = mPlaybackBuffers[0]->AvailForPut(); int commonlyAvail = mPlaybackBuffers[0]->AvailForPut();
unsigned int i; unsigned int i;
for( i = 1; i < mPlaybackTracks->GetCount(); i++ ) for (i = 1; i < mPlaybackTracks->size(); i++)
{ {
int thisBlockAvail = mPlaybackBuffers[i]->AvailForPut(); int thisBlockAvail = mPlaybackBuffers[i]->AvailForPut();
@ -2889,7 +2889,7 @@ int AudioIO::GetCommonlyAvailCapture()
int commonlyAvail = mCaptureBuffers[0]->AvailForGet(); int commonlyAvail = mCaptureBuffers[0]->AvailForGet();
unsigned int i; unsigned int i;
for( i = 1; i < mCaptureTracks->GetCount(); i++ ) for (i = 1; i < mCaptureTracks->size(); i++)
{ {
int avail = mCaptureBuffers[i]->AvailForGet(); int avail = mCaptureBuffers[i]->AvailForGet();
if( avail < commonlyAvail ) if( avail < commonlyAvail )
@ -3268,7 +3268,7 @@ void AudioIO::FillBuffers()
{ {
unsigned int i; unsigned int i;
if( mPlaybackTracks->GetCount() > 0 ) if (mPlaybackTracks->size() > 0)
{ {
// Though extremely unlikely, it is possible that some buffers // Though extremely unlikely, it is possible that some buffers
// will have more samples available than others. This could happen // will have more samples available than others. This could happen
@ -3325,7 +3325,7 @@ void AudioIO::FillBuffers()
mWarpedTime += deltat; mWarpedTime += deltat;
} }
for( i = 0; i < mPlaybackTracks->GetCount(); i++ ) for (i = 0; i < mPlaybackTracks->size(); i++)
{ {
// The mixer here isn't actually mixing: it's just doing // The mixer here isn't actually mixing: it's just doing
// resampling, format conversion, and possibly time track // resampling, format conversion, and possibly time track
@ -3395,7 +3395,7 @@ void AudioIO::FillBuffers()
startTime = startSample / mRate; startTime = startSample / mRate;
endTime = endSample / mRate; endTime = endSample / mRate;
speed = double(abs(endSample - startSample)) / mScrubDuration; speed = double(abs(endSample - startSample)) / mScrubDuration;
for (i = 0; i < mPlaybackTracks->GetCount(); i++) for (i = 0; i < mPlaybackTracks->size(); i++)
mPlaybackMixers[i]->SetTimesAndSpeed(startTime, endTime, speed); mPlaybackMixers[i]->SetTimesAndSpeed(startTime, endTime, speed);
} }
} }
@ -3410,7 +3410,7 @@ void AudioIO::FillBuffers()
// and if yes, restart from the beginning. // and if yes, restart from the beginning.
if (mWarpedTime >= mWarpedLength) if (mWarpedTime >= mWarpedLength)
{ {
for (i = 0; i < mPlaybackTracks->GetCount(); i++) for (i = 0; i < mPlaybackTracks->size(); i++)
mPlaybackMixers[i]->Restart(); mPlaybackMixers[i]->Restart();
mWarpedTime = 0.0; mWarpedTime = 0.0;
} }
@ -3424,7 +3424,7 @@ void AudioIO::FillBuffers()
} }
} // end of playback buffering } // end of playback buffering
if( mCaptureTracks->GetCount() > 0 ) // start record buffering if (mCaptureTracks->size() > 0) // start record buffering
{ {
int commonlyAvail = GetCommonlyAvailCapture(); int commonlyAvail = GetCommonlyAvailCapture();
@ -3439,7 +3439,7 @@ void AudioIO::FillBuffers()
// Append captured samples to the end of the WaveTracks. // Append captured samples to the end of the WaveTracks.
// The WaveTracks have their own buffering for efficiency. // The WaveTracks have their own buffering for efficiency.
AutoSaveFile blockFileLog; AutoSaveFile blockFileLog;
int numChannels = mCaptureTracks->GetCount(); int numChannels = mCaptureTracks->size();
for( i = 0; (int)i < numChannels; i++ ) for( i = 0; (int)i < numChannels; i++ )
{ {
@ -3948,7 +3948,7 @@ int audacityAudioCallback(const void *inputBuffer, void *outputBuffer,
const PaStreamCallbackFlags WXUNUSED(statusFlags), void * WXUNUSED(userData) ) const PaStreamCallbackFlags WXUNUSED(statusFlags), void * WXUNUSED(userData) )
{ {
int numPlaybackChannels = gAudioIO->mNumPlaybackChannels; int numPlaybackChannels = gAudioIO->mNumPlaybackChannels;
int numPlaybackTracks = gAudioIO->mPlaybackTracks->GetCount(); int numPlaybackTracks = gAudioIO->mPlaybackTracks->size();
int numCaptureChannels = gAudioIO->mNumCaptureChannels; int numCaptureChannels = gAudioIO->mNumCaptureChannels;
int callbackReturn = paContinue; int callbackReturn = paContinue;
void *tempBuffer = alloca(framesPerBuffer*sizeof(float)* void *tempBuffer = alloca(framesPerBuffer*sizeof(float)*

View File

@ -287,7 +287,7 @@ int RecordingRecoveryHandler::FindTrack() const
int index; int index;
if (mAutoSaveIdent) if (mAutoSaveIdent)
{ {
for (index = 0; index < (int)tracks.GetCount(); index++) for (index = 0; index < (int)tracks.size(); index++)
{ {
if (tracks[index]->GetAutoSaveIdent() == mAutoSaveIdent) if (tracks[index]->GetAutoSaveIdent() == mAutoSaveIdent)
{ {
@ -297,7 +297,7 @@ int RecordingRecoveryHandler::FindTrack() const
} }
else else
{ {
index = tracks.GetCount() - mNumChannels + mChannel; index = tracks.size() - mNumChannels + mChannel;
} }
return index; return index;
@ -320,14 +320,14 @@ bool RecordingRecoveryHandler::HandleXMLTag(const wxChar *tag,
int index = FindTrack(); int index = FindTrack();
// We need to find the track and sequence where the blockfile belongs // We need to find the track and sequence where the blockfile belongs
if (index < 0 || index >= (int) tracks.GetCount()) if (index < 0 || index >= (int)tracks.size())
{ {
// This should only happen if there is a bug // This should only happen if there is a bug
wxASSERT(false); wxASSERT(false);
return false; return false;
} }
WaveTrack* track = tracks.Item(index); WaveTrack* track = tracks[index];
WaveClip* clip = track->NewestOrNewClip(); WaveClip* clip = track->NewestOrNewClip();
Sequence* seq = clip->GetSequence(); Sequence* seq = clip->GetSequence();
@ -407,12 +407,12 @@ void RecordingRecoveryHandler::HandleXMLEndTag(const wxChar *tag)
int index = FindTrack(); int index = FindTrack();
// We need to find the track and sequence where the blockfile belongs // We need to find the track and sequence where the blockfile belongs
if (index < 0 || index >= (int)tracks.GetCount()) { if (index < 0 || index >= (int)tracks.size()) {
// This should only happen if there is a bug // This should only happen if there is a bug
wxASSERT(false); wxASSERT(false);
} }
else { else {
WaveTrack* track = tracks.Item(index); WaveTrack* track = tracks[index];
WaveClip* clip = track->NewestOrNewClip(); WaveClip* clip = track->NewestOrNewClip();
Sequence* seq = clip->GetSequence(); Sequence* seq = clip->GetSequence();

View File

@ -49,14 +49,10 @@ bool MixAndRender(TrackList *tracks, TrackFactory *trackFactory,
WaveTrack **newLeft, WaveTrack **newRight) WaveTrack **newLeft, WaveTrack **newRight)
{ {
// This function was formerly known as "Quick Mix". // This function was formerly known as "Quick Mix".
WaveTrack **waveArray;
Track *t; Track *t;
int numWaves = 0; /* number of wave tracks in the selection */
int numMono = 0; /* number of mono, centre-panned wave tracks in selection*/
bool mono = false; /* flag if output can be mono without loosing anything*/ bool mono = false; /* flag if output can be mono without loosing anything*/
bool oneinput = false; /* flag set to true if there is only one input track bool oneinput = false; /* flag set to true if there is only one input track
(mono or stereo) */ (mono or stereo) */
int w;
TrackListIterator iter(tracks); TrackListIterator iter(tracks);
SelectedTrackListOfKindIterator usefulIter(Track::Wave, tracks); SelectedTrackListOfKindIterator usefulIter(Track::Wave, tracks);
@ -64,6 +60,8 @@ bool MixAndRender(TrackList *tracks, TrackFactory *trackFactory,
// selected WaveTracks. The tracklist is (confusingly) the list of all // selected WaveTracks. The tracklist is (confusingly) the list of all
// tracks in the project // tracks in the project
int numWaves = 0; /* number of wave tracks in the selection */
int numMono = 0; /* number of mono, centre-panned wave tracks in selection*/
t = iter.First(); t = iter.First();
while (t) { while (t) {
if (t->GetSelected() && t->GetKind() == Track::Wave) { if (t->GetSelected() && t->GetKind() == Track::Wave) {
@ -89,13 +87,12 @@ bool MixAndRender(TrackList *tracks, TrackFactory *trackFactory,
double mixEndTime = 0.0; /* end time of last track to end */ double mixEndTime = 0.0; /* end time of last track to end */
double tstart, tend; // start and end times for one track. double tstart, tend; // start and end times for one track.
waveArray = new WaveTrack *[numWaves]; WaveTrackConstArray waveArray;
w = 0;
t = iter.First(); t = iter.First();
while (t) { while (t) {
if (t->GetSelected() && t->GetKind() == Track::Wave) { if (t->GetSelected() && t->GetKind() == Track::Wave) {
waveArray[w++] = (WaveTrack *) t; waveArray.push_back(static_cast<WaveTrack *>(t));
tstart = t->GetStartTime(); tstart = t->GetStartTime();
tend = t->GetEndTime(); tend = t->GetEndTime();
if (tend > mixEndTime) if (tend > mixEndTime)
@ -161,7 +158,7 @@ bool MixAndRender(TrackList *tracks, TrackFactory *trackFactory,
endTime = mixEndTime; endTime = mixEndTime;
} }
Mixer mixer(numWaves, waveArray, Mixer mixer(waveArray,
Mixer::WarpOptions(tracks->GetTimeTrack()), Mixer::WarpOptions(tracks->GetTimeTrack()),
startTime, endTime, mono ? 1 : 2, maxBlockLen, false, startTime, endTime, mono ? 1 : 2, maxBlockLen, false,
rate, format); rate, format);
@ -221,9 +218,6 @@ bool MixAndRender(TrackList *tracks, TrackFactory *trackFactory,
printf("Max number of tracks to mix in real time: %f\n", maxTracks); printf("Max number of tracks to mix in real time: %f\n", maxTracks);
#endif #endif
} }
delete[] waveArray;
return (updateResult == eProgressSuccess || updateResult == eProgressStopped); return (updateResult == eProgressSuccess || updateResult == eProgressStopped);
} }
@ -247,7 +241,7 @@ Mixer::WarpOptions::WarpOptions(double min, double max)
} }
} }
Mixer::Mixer(int numInputTracks, WaveTrack **inputTracks, Mixer::Mixer(const WaveTrackConstArray &inputTracks,
const WarpOptions &warpOptions, const WarpOptions &warpOptions,
double startTime, double stopTime, double startTime, double stopTime,
int numOutChannels, int outBufferSize, bool outInterleaved, int numOutChannels, int outBufferSize, bool outInterleaved,
@ -256,9 +250,10 @@ Mixer::Mixer(int numInputTracks, WaveTrack **inputTracks,
{ {
int i; int i;
const auto numInputTracks = inputTracks.size();
mHighQuality = highQuality; mHighQuality = highQuality;
mNumInputTracks = numInputTracks; mNumInputTracks = numInputTracks;
mInputTrack = new WaveTrack*[mNumInputTracks]; mInputTrack = new const WaveTrack*[mNumInputTracks];
// mSamplePos holds for each track the next sample position not // mSamplePos holds for each track the next sample position not
// yet processed. // yet processed.
@ -415,7 +410,7 @@ void MixBuffers(int numChannels, int *channelFlags, float *gains,
} }
} }
sampleCount Mixer::MixVariableRates(int *channelFlags, WaveTrack *track, sampleCount Mixer::MixVariableRates(int *channelFlags, const WaveTrack *track,
sampleCount *pos, float *queue, sampleCount *pos, float *queue,
int *queueStart, int *queueLen, int *queueStart, int *queueLen,
Resample * pResample) Resample * pResample)
@ -565,7 +560,7 @@ sampleCount Mixer::MixVariableRates(int *channelFlags, WaveTrack *track,
return out; return out;
} }
sampleCount Mixer::MixSameRate(int *channelFlags, WaveTrack *track, sampleCount Mixer::MixSameRate(int *channelFlags, const WaveTrack *track,
sampleCount *pos) sampleCount *pos)
{ {
int slen = mMaxOut; int slen = mMaxOut;
@ -639,7 +634,7 @@ sampleCount Mixer::Process(sampleCount maxToProcess)
Clear(); Clear();
for(i=0; i<mNumInputTracks; i++) { for(i=0; i<mNumInputTracks; i++) {
WaveTrack *track = mInputTrack[i]; const WaveTrack *track = mInputTrack[i];
for(j=0; j<mNumChannels; j++) for(j=0; j<mNumChannels; j++)
channelFlags[j] = 0; channelFlags[j] = 0;

View File

@ -22,6 +22,7 @@ class TimeTrack;
class TrackFactory; class TrackFactory;
class TrackList; class TrackList;
class WaveTrack; class WaveTrack;
class WaveTrackConstArray;
/** @brief Mixes together all input tracks, applying any envelopes, amplitude /** @brief Mixes together all input tracks, applying any envelopes, amplitude
* gain, panning, and real-time effects in the process. * gain, panning, and real-time effects in the process.
@ -74,7 +75,7 @@ class AUDACITY_DLL_API Mixer {
class WarpOptions class WarpOptions
{ {
public: public:
explicit WarpOptions(TimeTrack *t) explicit WarpOptions(const TimeTrack *t)
: timeTrack(t), minSpeed(0.0), maxSpeed(0.0) : timeTrack(t), minSpeed(0.0), maxSpeed(0.0)
{} {}
@ -82,7 +83,7 @@ class AUDACITY_DLL_API Mixer {
private: private:
friend class Mixer; friend class Mixer;
TimeTrack *timeTrack; const TimeTrack *timeTrack;
double minSpeed, maxSpeed; double minSpeed, maxSpeed;
}; };
@ -90,7 +91,7 @@ class AUDACITY_DLL_API Mixer {
// Constructor / Destructor // Constructor / Destructor
// //
Mixer(int numInputTracks, WaveTrack **inputTracks, Mixer(const WaveTrackConstArray &inputTracks,
const WarpOptions &warpOptions, const WarpOptions &warpOptions,
double startTime, double stopTime, double startTime, double stopTime,
int numOutChannels, int outBufferSize, bool outInterleaved, int numOutChannels, int outBufferSize, bool outInterleaved,
@ -139,10 +140,10 @@ class AUDACITY_DLL_API Mixer {
private: private:
void Clear(); void Clear();
sampleCount MixSameRate(int *channelFlags, WaveTrack *src, sampleCount MixSameRate(int *channelFlags, const WaveTrack *src,
sampleCount *pos); sampleCount *pos);
sampleCount MixVariableRates(int *channelFlags, WaveTrack *track, sampleCount MixVariableRates(int *channelFlags, const WaveTrack *track,
sampleCount *pos, float *queue, sampleCount *pos, float *queue,
int *queueStart, int *queueLen, int *queueStart, int *queueLen,
Resample * pResample); Resample * pResample);
@ -150,9 +151,9 @@ class AUDACITY_DLL_API Mixer {
private: private:
// Input // Input
int mNumInputTracks; int mNumInputTracks;
WaveTrack **mInputTrack; const WaveTrack **mInputTrack;
bool mbVariableRates; bool mbVariableRates;
TimeTrack *mTimeTrack; const TimeTrack *mTimeTrack;
sampleCount *mSamplePos; sampleCount *mSamplePos;
bool mApplyTrackGains; bool mApplyTrackGains;
float *mGains; float *mGains;

View File

@ -453,7 +453,7 @@ bool ImportXMLTagHandler::HandleXMLTag(const wxChar *tag, const wxChar **attrs)
WaveTrackArray trackArray; WaveTrackArray trackArray;
mProject->Import(strAttr, &trackArray); mProject->Import(strAttr, &trackArray);
if (trackArray.IsEmpty()) if (trackArray.empty())
return false; return false;
// Handle other attributes, now that we have the tracks. // Handle other attributes, now that we have the tracks.
@ -461,7 +461,7 @@ bool ImportXMLTagHandler::HandleXMLTag(const wxChar *tag, const wxChar **attrs)
const wxChar** pAttr; const wxChar** pAttr;
bool bSuccess = true; bool bSuccess = true;
for (size_t i = 0; i < trackArray.GetCount(); i++) for (size_t i = 0; i < trackArray.size(); i++)
{ {
// Most of the "import" tag attributes are the same as for "wavetrack" tags, // Most of the "import" tag attributes are the same as for "wavetrack" tags,
// so apply them via WaveTrack::HandleXMLTag(). // so apply them via WaveTrack::HandleXMLTag().
@ -3822,7 +3822,7 @@ bool AudacityProject::Import(const wxString &fileName, WaveTrackArray* pTrackArr
if (pTrackArray) { if (pTrackArray) {
for (int i = 0; i < numTracks; i++) { for (int i = 0; i < numTracks; i++) {
if (newTracks[i]->GetKind() == Track::Wave) { if (newTracks[i]->GetKind() == Track::Wave) {
pTrackArray->Add((WaveTrack *)newTracks[i]); pTrackArray->push_back(static_cast<WaveTrack *>(newTracks[i]));
} }
} }
} }

View File

@ -1153,15 +1153,20 @@ TimeTrack *TrackList::GetTimeTrack()
return NULL; return NULL;
} }
int TrackList::GetNumExportChannels(bool selectionOnly) const TimeTrack *TrackList::GetTimeTrack() const
{
return const_cast<TrackList*>(this)->GetTimeTrack();
}
int TrackList::GetNumExportChannels(bool selectionOnly) const
{ {
/* counters for tracks panned different places */ /* counters for tracks panned different places */
int numLeft = 0; int numLeft = 0;
int numRight = 0; int numRight = 0;
int numMono = 0; int numMono = 0;
/* track iteration kit */ /* track iteration kit */
Track *tr; const Track *tr;
TrackListIterator iter; TrackListConstIterator iter;
for (tr = iter.First(this); tr != NULL; tr = iter.Next()) { for (tr = iter.First(this); tr != NULL; tr = iter.Next()) {
@ -1214,42 +1219,17 @@ int TrackList::GetNumExportChannels(bool selectionOnly)
return 1; return 1;
} }
void TrackList::GetWaveTracks(bool selectionOnly, namespace {
int *num, WaveTrack ***tracks) template<typename Array>
Array GetWaveTracks(TrackListNode *p, bool selectionOnly, bool includeMuted)
{ {
int i; Array waveTrackArray;
*num = 0;
TrackListNode *p = head;
while (p) {
if (p->t->GetKind() == Track::Wave && !(p->t->GetMute()) &&
(p->t->GetSelected() || !selectionOnly)) {
(*num)++;
}
p = p->next;
}
*tracks = new WaveTrack*[*num];
p = head;
i = 0;
while (p) {
if (p->t->GetKind() == Track::Wave && !(p->t->GetMute()) &&
(p->t->GetSelected() || !selectionOnly)) {
(*tracks)[i++] = (WaveTrack *)p->t;
}
p = p->next;
}
}
WaveTrackArray TrackList::GetWaveTrackArray(bool selectionOnly)
{
WaveTrackArray waveTrackArray;
TrackListNode *p = head;
while (p) { while (p) {
if (p->t->GetKind() == Track::Wave && if (p->t->GetKind() == Track::Wave &&
(includeMuted || !p->t->GetMute()) &&
(p->t->GetSelected() || !selectionOnly)) { (p->t->GetSelected() || !selectionOnly)) {
waveTrackArray.Add((WaveTrack*)p->t); waveTrackArray.push_back(static_cast<WaveTrack*>(p->t));
} }
p = p->next; p = p->next;
@ -1257,6 +1237,17 @@ WaveTrackArray TrackList::GetWaveTrackArray(bool selectionOnly)
return waveTrackArray; return waveTrackArray;
} }
}
WaveTrackArray TrackList::GetWaveTrackArray(bool selectionOnly, bool includeMuted)
{
return GetWaveTracks<WaveTrackArray>(head, selectionOnly, includeMuted);
}
WaveTrackConstArray TrackList::GetWaveTrackConstArray(bool selectionOnly, bool includeMuted) const
{
return GetWaveTracks<WaveTrackConstArray>(head, selectionOnly, includeMuted);
}
#if defined(USE_MIDI) #if defined(USE_MIDI)
NoteTrackArray TrackList::GetNoteTrackArray(bool selectionOnly) NoteTrackArray TrackList::GetNoteTrackArray(bool selectionOnly)

View File

@ -13,6 +13,7 @@
#include "Audacity.h" #include "Audacity.h"
#include <vector>
#include <wx/dynarray.h> #include <wx/dynarray.h>
#include <wx/event.h> #include <wx/event.h>
#include <wx/gdicmn.h> #include <wx/gdicmn.h>
@ -37,7 +38,15 @@ class AudacityProject;
class ZoomInfo; class ZoomInfo;
WX_DEFINE_USER_EXPORTED_ARRAY(Track*, TrackArray, class AUDACITY_DLL_API); WX_DEFINE_USER_EXPORTED_ARRAY(Track*, TrackArray, class AUDACITY_DLL_API);
WX_DEFINE_USER_EXPORTED_ARRAY(WaveTrack*, WaveTrackArray, class AUDACITY_DLL_API); class WaveTrackArray : public std::vector < WaveTrack* > {
};
class WaveTrackConstArray : public std::vector < const WaveTrack* > {
public:
WaveTrackConstArray() {}
// I'd like to use an inherited constructor, but that's not here yet in MSVC compiler...
WaveTrackConstArray
(std::initializer_list<value_type> tracks) : std::vector<value_type>(tracks) {}
};
#if defined(USE_MIDI) #if defined(USE_MIDI)
class NoteTrack; class NoteTrack;
@ -417,6 +426,7 @@ class AUDACITY_DLL_API TrackList final : public wxEvtHandler
bool Move(Track * t, bool up) { return up ? MoveUp(t) : MoveDown(t); } bool Move(Track * t, bool up) { return up ? MoveUp(t) : MoveDown(t); }
TimeTrack *GetTimeTrack(); TimeTrack *GetTimeTrack();
const TimeTrack *GetTimeTrack() const;
/** \brief Find out how many channels this track list mixes to /** \brief Find out how many channels this track list mixes to
* *
@ -424,11 +434,10 @@ class AUDACITY_DLL_API TrackList final : public wxEvtHandler
* Mono, Stereo etc. @param selectionOnly Whether to consider the entire track * Mono, Stereo etc. @param selectionOnly Whether to consider the entire track
* list or only the selected members of it * list or only the selected members of it
*/ */
int GetNumExportChannels(bool selectionOnly); int GetNumExportChannels(bool selectionOnly) const;
WaveTrackArray GetWaveTrackArray(bool selectionOnly); WaveTrackArray GetWaveTrackArray(bool selectionOnly, bool includeMuted = true);
/** Consider this function depricated in favor of GetWaveTrackArray */ WaveTrackConstArray GetWaveTrackConstArray(bool selectionOnly, bool includeMuted = true) const;
void GetWaveTracks(bool selectionOnly, int *num, WaveTrack ***tracks);
#if defined(USE_MIDI) #if defined(USE_MIDI)
NoteTrackArray GetNoteTrackArray(bool selectionOnly); NoteTrackArray GetNoteTrackArray(bool selectionOnly);

View File

@ -2641,7 +2641,7 @@ void Effect::Preview(bool dryOnly)
SelectedTrackListOfKindIterator iter(Track::Wave, mTracks); SelectedTrackListOfKindIterator iter(Track::Wave, mTracks);
WaveTrack *src = (WaveTrack *) iter.First(); WaveTrack *src = (WaveTrack *) iter.First();
while (src) { while (src) {
playbackTracks.Add(src); playbackTracks.push_back(src);
src = (WaveTrack *) iter.Next(); src = (WaveTrack *) iter.Next();
} }
// Some effects (Paulstretch) may need to generate more // Some effects (Paulstretch) may need to generate more

View File

@ -243,15 +243,15 @@ wxWindow *ExportPlugin::OptionsCreate(wxWindow *parent, int WXUNUSED(format))
} }
//Create a mixer by computing the time warp factor //Create a mixer by computing the time warp factor
Mixer* ExportPlugin::CreateMixer(int numInputTracks, WaveTrack **inputTracks, Mixer* ExportPlugin::CreateMixer(const WaveTrackConstArray &inputTracks,
TimeTrack *timeTrack, const TimeTrack *timeTrack,
double startTime, double stopTime, double startTime, double stopTime,
int numOutChannels, int outBufferSize, bool outInterleaved, int numOutChannels, int outBufferSize, bool outInterleaved,
double outRate, sampleFormat outFormat, double outRate, sampleFormat outFormat,
bool highQuality, MixerSpec *mixerSpec) bool highQuality, MixerSpec *mixerSpec)
{ {
// MB: the stop time should not be warped, this was a bug. // MB: the stop time should not be warped, this was a bug.
return new Mixer(numInputTracks, inputTracks, return new Mixer(inputTracks,
Mixer::WarpOptions(timeTrack), Mixer::WarpOptions(timeTrack),
startTime, stopTime, startTime, stopTime,
numOutChannels, outBufferSize, outInterleaved, numOutChannels, outBufferSize, outInterleaved,
@ -431,9 +431,9 @@ bool Exporter::ExamineTracks()
double earliestBegin = mT1; double earliestBegin = mT1;
double latestEnd = mT0; double latestEnd = mT0;
TrackList *tracks = mProject->GetTracks(); const TrackList *tracks = mProject->GetTracks();
TrackListIterator iter1(tracks); TrackListConstIterator iter1(tracks);
Track *tr = iter1.First(); const Track *tr = iter1.First();
while (tr) { while (tr) {
if (tr->GetKind() == Track::Wave) { if (tr->GetKind() == Track::Wave) {
@ -1148,7 +1148,7 @@ BEGIN_EVENT_TABLE( ExportMixerDialog,wxDialog )
EVT_SLIDER( ID_SLIDER_CHANNEL, ExportMixerDialog::OnSlider ) EVT_SLIDER( ID_SLIDER_CHANNEL, ExportMixerDialog::OnSlider )
END_EVENT_TABLE() END_EVENT_TABLE()
ExportMixerDialog::ExportMixerDialog( TrackList *tracks, bool selectedOnly, ExportMixerDialog::ExportMixerDialog( const TrackList *tracks, bool selectedOnly,
int maxNumChannels, wxWindow *parent, wxWindowID id, const wxString &title, int maxNumChannels, wxWindow *parent, wxWindowID id, const wxString &title,
const wxPoint &position, const wxSize& size, long style ) : const wxPoint &position, const wxSize& size, long style ) :
wxDialog( parent, id, title, position, size, style | wxRESIZE_BORDER ) wxDialog( parent, id, title, position, size, style | wxRESIZE_BORDER )
@ -1156,9 +1156,9 @@ ExportMixerDialog::ExportMixerDialog( TrackList *tracks, bool selectedOnly,
SetName(GetTitle()); SetName(GetTitle());
int numTracks = 0; int numTracks = 0;
TrackListIterator iter( tracks ); TrackListConstIterator iter( tracks );
for( Track *t = iter.First(); t; t = iter.Next() ) for( const Track *t = iter.First(); t; t = iter.Next() )
{ {
if( t->GetKind() == Track::Wave && ( t->GetSelected() || !selectedOnly ) && !t->GetMute() ) if( t->GetKind() == Track::Wave && ( t->GetSelected() || !selectedOnly ) && !t->GetMute() )
{ {

View File

@ -30,6 +30,7 @@ class TrackList;
class MixerSpec; class MixerSpec;
class TimeTrack; class TimeTrack;
class Mixer; class Mixer;
class WaveTrackConstArray;
class AUDACITY_DLL_API FormatInfo class AUDACITY_DLL_API FormatInfo
{ {
@ -114,8 +115,8 @@ public:
int subformat = 0) = 0; int subformat = 0) = 0;
protected: protected:
Mixer* CreateMixer(int numInputTracks, WaveTrack **inputTracks, Mixer* CreateMixer(const WaveTrackConstArray &inputTracks,
TimeTrack *timeTrack, const TimeTrack *timeTrack,
double startTime, double stopTime, double startTime, double stopTime,
int numOutChannels, int outBufferSize, bool outInterleaved, int numOutChannels, int outBufferSize, bool outInterleaved,
double outRate, sampleFormat outFormat, double outRate, sampleFormat outFormat,
@ -232,7 +233,7 @@ class ExportMixerDialog final : public wxDialog
{ {
public: public:
// constructors and destructors // constructors and destructors
ExportMixerDialog( TrackList * tracks, bool selectedOnly, int maxNumChannels, ExportMixerDialog( const TrackList * tracks, bool selectedOnly, int maxNumChannels,
wxWindow *parent, wxWindowID id, const wxString &title, wxWindow *parent, wxWindowID id, const wxString &title,
const wxPoint& pos = wxDefaultPosition, const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize, const wxSize& size = wxDefaultSize,

View File

@ -419,11 +419,10 @@ int ExportCL::Export(AudacityProject *project,
os->Write(&header, sizeof(wav_header)); os->Write(&header, sizeof(wav_header));
// Mix 'em up // Mix 'em up
int numWaveTracks; const TrackList *tracks = project->GetTracks();
WaveTrack **waveTracks; const WaveTrackConstArray waveTracks =
TrackList *tracks = project->GetTracks(); tracks->GetWaveTrackConstArray(selectionOnly, false);
tracks->GetWaveTracks(selectionOnly, &numWaveTracks, &waveTracks); Mixer *mixer = CreateMixer(
Mixer *mixer = CreateMixer(numWaveTracks,
waveTracks, waveTracks,
tracks->GetTimeTrack(), tracks->GetTimeTrack(),
t0, t0,
@ -529,7 +528,6 @@ int ExportCL::Export(AudacityProject *project,
// Clean up // Clean up
delete mixer; delete mixer;
delete[] waveTracks;
return updateResult; return updateResult;
} }

View File

@ -817,7 +817,7 @@ int ExportFFmpeg::Export(AudacityProject *project,
return false; return false;
} }
mName = fName; mName = fName;
TrackList *tracks = project->GetTracks(); const TrackList *tracks = project->GetTracks();
bool ret = true; bool ret = true;
if (mSubFormat >= FMT_LAST) return false; if (mSubFormat >= FMT_LAST) return false;
@ -830,15 +830,13 @@ int ExportFFmpeg::Export(AudacityProject *project,
if (!ret) return false; if (!ret) return false;
int pcmBufferSize = 1024; int pcmBufferSize = 1024;
int numWaveTracks; const WaveTrackConstArray waveTracks =
WaveTrack **waveTracks; tracks->GetWaveTrackConstArray(selectionOnly, false);
tracks->GetWaveTracks(selectionOnly, &numWaveTracks, &waveTracks); Mixer *mixer = CreateMixer(waveTracks,
Mixer *mixer = CreateMixer(numWaveTracks, waveTracks,
tracks->GetTimeTrack(), tracks->GetTimeTrack(),
t0, t1, t0, t1,
channels, pcmBufferSize, true, channels, pcmBufferSize, true,
mSampleRate, int16Sample, true, mixerSpec); mSampleRate, int16Sample, true, mixerSpec);
delete[] waveTracks;
int updateResult = eProgressSuccess; int updateResult = eProgressSuccess;
{ {

View File

@ -229,7 +229,7 @@ int ExportFLAC::Export(AudacityProject *project,
int WXUNUSED(subformat)) int WXUNUSED(subformat))
{ {
double rate = project->GetRate(); double rate = project->GetRate();
TrackList *tracks = project->GetTracks(); const TrackList *tracks = project->GetTracks();
wxLogNull logNo; // temporarily disable wxWidgets error messages wxLogNull logNo; // temporarily disable wxWidgets error messages
int updateResult = eProgressSuccess; int updateResult = eProgressSuccess;
@ -309,15 +309,13 @@ int ExportFLAC::Export(AudacityProject *project,
::FLAC__metadata_object_delete(mMetadata); ::FLAC__metadata_object_delete(mMetadata);
} }
int numWaveTracks; const WaveTrackConstArray waveTracks =
WaveTrack **waveTracks; tracks->GetWaveTrackConstArray(selectionOnly, false);
tracks->GetWaveTracks(selectionOnly, &numWaveTracks, &waveTracks); Mixer *mixer = CreateMixer(waveTracks,
Mixer *mixer = CreateMixer(numWaveTracks, waveTracks,
tracks->GetTimeTrack(), tracks->GetTimeTrack(),
t0, t1, t0, t1,
numChannels, SAMPLES_PER_RUN, false, numChannels, SAMPLES_PER_RUN, false,
rate, format, true, mixerSpec); rate, format, true, mixerSpec);
delete [] waveTracks;
int i, j; int i, j;
FLAC__int32 **tmpsmplbuf = new FLAC__int32*[numChannels]; FLAC__int32 **tmpsmplbuf = new FLAC__int32*[numChannels];

View File

@ -217,7 +217,7 @@ int ExportMP2::Export(AudacityProject *project,
bool stereo = (channels == 2); bool stereo = (channels == 2);
long bitrate = gPrefs->Read(wxT("/FileFormats/MP2Bitrate"), 160); long bitrate = gPrefs->Read(wxT("/FileFormats/MP2Bitrate"), 160);
double rate = project->GetRate(); double rate = project->GetRate();
TrackList *tracks = project->GetTracks(); const TrackList *tracks = project->GetTracks();
wxLogNull logNo; /* temporarily disable wxWidgets error messages */ wxLogNull logNo; /* temporarily disable wxWidgets error messages */
@ -264,15 +264,13 @@ int ExportMP2::Export(AudacityProject *project,
// We have to multiply by 4 because one sample is 2 bytes wide! // We have to multiply by 4 because one sample is 2 bytes wide!
unsigned char* mp2Buffer = new unsigned char[mp2BufferSize]; unsigned char* mp2Buffer = new unsigned char[mp2BufferSize];
int numWaveTracks; const WaveTrackConstArray waveTracks =
WaveTrack **waveTracks; tracks->GetWaveTrackConstArray(selectionOnly, false);
tracks->GetWaveTracks(selectionOnly, &numWaveTracks, &waveTracks); Mixer *mixer = CreateMixer(waveTracks,
Mixer *mixer = CreateMixer(numWaveTracks, waveTracks,
tracks->GetTimeTrack(), tracks->GetTimeTrack(),
t0, t1, t0, t1,
stereo? 2: 1, pcmBufferSize, true, stereo? 2: 1, pcmBufferSize, true,
rate, int16Sample, true, mixerSpec); rate, int16Sample, true, mixerSpec);
delete[] waveTracks;
int updateResult = eProgressSuccess; int updateResult = eProgressSuccess;
{ {

View File

@ -1631,7 +1631,7 @@ int ExportMP3::Export(AudacityProject *project,
#ifndef DISABLE_DYNAMIC_LOADING_LAME #ifndef DISABLE_DYNAMIC_LOADING_LAME
wxWindow *parent = project; wxWindow *parent = project;
#endif // DISABLE_DYNAMIC_LOADING_LAME #endif // DISABLE_DYNAMIC_LOADING_LAME
TrackList *tracks = project->GetTracks(); const TrackList *tracks = project->GetTracks();
MP3Exporter exporter; MP3Exporter exporter;
#ifdef DISABLE_DYNAMIC_LOADING_LAME #ifdef DISABLE_DYNAMIC_LOADING_LAME
@ -1762,15 +1762,13 @@ int ExportMP3::Export(AudacityProject *project,
unsigned char *buffer = new unsigned char[bufferSize]; unsigned char *buffer = new unsigned char[bufferSize];
wxASSERT(buffer); wxASSERT(buffer);
int numWaveTracks; const WaveTrackConstArray waveTracks =
WaveTrack **waveTracks; tracks->GetWaveTrackConstArray(selectionOnly, false);
tracks->GetWaveTracks(selectionOnly, &numWaveTracks, &waveTracks); Mixer *mixer = CreateMixer(waveTracks,
Mixer *mixer = CreateMixer(numWaveTracks, waveTracks,
tracks->GetTimeTrack(), tracks->GetTimeTrack(),
t0, t1, t0, t1,
channels, inSamples, true, channels, inSamples, true,
rate, int16Sample, true, mixerSpec); rate, int16Sample, true, mixerSpec);
delete [] waveTracks;
wxString title; wxString title;
if (rmode == MODE_SET) { if (rmode == MODE_SET) {

View File

@ -105,7 +105,6 @@ END_EVENT_TABLE()
ExportMultiple::ExportMultiple(AudacityProject *project) ExportMultiple::ExportMultiple(AudacityProject *project)
: wxDialog(project, wxID_ANY, wxString(_("Export Multiple"))) : wxDialog(project, wxID_ANY, wxString(_("Export Multiple")))
, mIterator(new TrackListIterator)
{ {
SetName(GetTitle()); SetName(GetTitle());
@ -141,7 +140,6 @@ ExportMultiple::ExportMultiple(AudacityProject *project)
ExportMultiple::~ExportMultiple() ExportMultiple::~ExportMultiple()
{ {
delete mIterator;
} }
void ExportMultiple::CountTracksAndLabels() void ExportMultiple::CountTracksAndLabels()
@ -150,8 +148,9 @@ void ExportMultiple::CountTracksAndLabels()
mNumLabels = 0; mNumLabels = 0;
mNumWaveTracks = 0; mNumWaveTracks = 0;
Track* pTrack; const Track* pTrack;
for (pTrack = mIterator->First(mTracks); pTrack != NULL; pTrack = mIterator->Next()) TrackListConstIterator iter;
for (pTrack = iter.First(mTracks); pTrack != NULL; pTrack = iter.Next())
{ {
switch (pTrack->GetKind()) switch (pTrack->GetKind())
{ {
@ -746,7 +745,7 @@ int ExportMultiple::ExportMultipleByTrack(bool byName,
int numTracks = 0; int numTracks = 0;
int ok = eProgressSuccess; int ok = eProgressSuccess;
wxArrayString otherNames; wxArrayString otherNames;
wxArrayPtrVoid selected; /**< Array of pointers to the tracks which were std::vector<Track*> selected; /**< Array of pointers to the tracks which were
selected when we started */ selected when we started */
ExportKitArray exportSettings; // dynamic array we will use to store the ExportKitArray exportSettings; // dynamic array we will use to store the
// settings needed to do the exports with in // settings needed to do the exports with in
@ -759,13 +758,14 @@ int ExportMultiple::ExportMultipleByTrack(bool byName,
wxString title; // un-messed-with title of file for tagging with wxString title; // un-messed-with title of file for tagging with
/* Remember which tracks were selected, and set them to unselected */ /* Remember which tracks were selected, and set them to unselected */
for (tr = mIterator->First(mTracks); tr != NULL; tr = mIterator->Next()) { TrackListIterator iter;
for (tr = iter.First(mTracks); tr != NULL; tr = iter.Next()) {
if (tr->GetKind() != Track::Wave) { if (tr->GetKind() != Track::Wave) {
continue; continue;
} }
if (tr->GetSelected()) { if (tr->GetSelected()) {
selected.Add(tr); selected.push_back(tr);
tr->SetSelected(false); tr->SetSelected(false);
} }
@ -775,7 +775,7 @@ int ExportMultiple::ExportMultipleByTrack(bool byName,
} }
/* Examine all tracks in turn, collecting export information */ /* Examine all tracks in turn, collecting export information */
for (tr = mIterator->First(mTracks); tr != NULL; tr = mIterator->Next()) { for (tr = iter.First(mTracks); tr != NULL; tr = iter.Next()) {
// Want only non-muted wave tracks. // Want only non-muted wave tracks.
if ((tr->GetKind() != Track::Wave) || tr->GetMute()) if ((tr->GetKind() != Track::Wave) || tr->GetMute())
@ -788,7 +788,7 @@ int ExportMultiple::ExportMultipleByTrack(bool byName,
// Check for a linked track // Check for a linked track
tr2 = NULL; tr2 = NULL;
if (tr->GetLinked()) { if (tr->GetLinked()) {
tr2 = mIterator->Next(); tr2 = iter.Next();
if (tr2) { if (tr2) {
// Make sure it gets included // Make sure it gets included
@ -858,7 +858,7 @@ int ExportMultiple::ExportMultipleByTrack(bool byName,
// loop // loop
int count = 0; // count the number of sucessful runs int count = 0; // count the number of sucessful runs
ExportKit activeSetting; // pointer to the settings in use for this export ExportKit activeSetting; // pointer to the settings in use for this export
for (tr = mIterator->First(mTracks); tr != NULL; tr = mIterator->Next()) { for (tr = iter.First(mTracks); tr != NULL; tr = iter.Next()) {
// Want only non-muted wave tracks. // Want only non-muted wave tracks.
if ((tr->GetKind() != Track::Wave) || (tr->GetMute() == true)) { if ((tr->GetKind() != Track::Wave) || (tr->GetMute() == true)) {
@ -871,7 +871,7 @@ int ExportMultiple::ExportMultipleByTrack(bool byName,
// Check for a linked track // Check for a linked track
tr2 = NULL; tr2 = NULL;
if (tr->GetLinked()) { if (tr->GetLinked()) {
tr2 = mIterator->Next(); tr2 = iter.Next();
if (tr2) { if (tr2) {
// Select it also // Select it also
tr2->SetSelected(true); tr2->SetSelected(true);
@ -900,7 +900,7 @@ int ExportMultiple::ExportMultipleByTrack(bool byName,
// Restore the selection states // Restore the selection states
for (size_t i = 0; i < mSelected.GetCount(); i++) { for (size_t i = 0; i < mSelected.GetCount(); i++) {
((Track *) selected[i])->SetSelected(true); selected[i]->SetSelected(true);
} }
return ok; return ok;

View File

@ -29,7 +29,6 @@ class wxTextCtrl;
class AudacityProject; class AudacityProject;
class LabelTrack; class LabelTrack;
class ShuttleGui; class ShuttleGui;
class TrackListIterator;
class ExportMultiple final : public wxDialog class ExportMultiple final : public wxDialog
{ {
@ -109,8 +108,6 @@ private:
AudacityProject *mProject; AudacityProject *mProject;
TrackList *mTracks; /**< The list of tracks in the project that is TrackList *mTracks; /**< The list of tracks in the project that is
being exported */ being exported */
TrackListIterator *mIterator; /**< Iterator used to work through all the
tracks in the project */
LabelTrack *mLabels; LabelTrack *mLabels;
int mNumLabels; int mNumLabels;
int mNumWaveTracks; int mNumWaveTracks;

View File

@ -175,7 +175,7 @@ int ExportOGG::Export(AudacityProject *project,
int WXUNUSED(subformat)) int WXUNUSED(subformat))
{ {
double rate = project->GetRate(); double rate = project->GetRate();
TrackList *tracks = project->GetTracks(); const TrackList *tracks = project->GetTracks();
double quality = (gPrefs->Read(wxT("/FileFormats/OggExportQuality"), 50)/(float)100.0); double quality = (gPrefs->Read(wxT("/FileFormats/OggExportQuality"), 50)/(float)100.0);
wxLogNull logNo; // temporarily disable wxWidgets error messages wxLogNull logNo; // temporarily disable wxWidgets error messages
@ -245,15 +245,13 @@ int ExportOGG::Export(AudacityProject *project,
outFile.Write(page.body, page.body_len); outFile.Write(page.body, page.body_len);
} }
int numWaveTracks; const WaveTrackConstArray waveTracks =
WaveTrack **waveTracks; tracks->GetWaveTrackConstArray(selectionOnly, false);
tracks->GetWaveTracks(selectionOnly, &numWaveTracks, &waveTracks); Mixer *mixer = CreateMixer(waveTracks,
Mixer *mixer = CreateMixer(numWaveTracks, waveTracks,
tracks->GetTimeTrack(), tracks->GetTimeTrack(),
t0, t1, t0, t1,
numChannels, SAMPLES_PER_RUN, false, numChannels, SAMPLES_PER_RUN, false,
rate, floatSample, true, mixerSpec); rate, floatSample, true, mixerSpec);
delete[] waveTracks;
{ {
ProgressDialog progress(wxFileName(fName).GetName(), ProgressDialog progress(wxFileName(fName).GetName(),

View File

@ -399,7 +399,7 @@ int ExportPCM::Export(AudacityProject *project,
int subformat) int subformat)
{ {
double rate = project->GetRate(); double rate = project->GetRate();
TrackList *tracks = project->GetTracks(); const TrackList *tracks = project->GetTracks();
int sf_format; int sf_format;
if (subformat < 0 || subformat >= WXSIZEOF(kFormats)) if (subformat < 0 || subformat >= WXSIZEOF(kFormats))
@ -484,10 +484,9 @@ int ExportPCM::Export(AudacityProject *project,
int updateResult = eProgressSuccess; int updateResult = eProgressSuccess;
int numWaveTracks; const WaveTrackConstArray waveTracks =
WaveTrack **waveTracks; tracks->GetWaveTrackConstArray(selectionOnly, false);
tracks->GetWaveTracks(selectionOnly, &numWaveTracks, &waveTracks); Mixer *mixer = CreateMixer(waveTracks,
Mixer *mixer = CreateMixer(numWaveTracks, waveTracks,
tracks->GetTimeTrack(), tracks->GetTimeTrack(),
t0, t1, t0, t1,
info.channels, maxBlockLen, true, info.channels, maxBlockLen, true,
@ -536,8 +535,6 @@ int ExportPCM::Export(AudacityProject *project,
delete mixer; delete mixer;
delete[] waveTracks;
// Install the WAV metata in a "LIST" chunk at the end of the file // Install the WAV metata in a "LIST" chunk at the end of the file
if ((sf_format & SF_FORMAT_TYPEMASK) == SF_FORMAT_WAV || if ((sf_format & SF_FORMAT_TYPEMASK) == SF_FORMAT_WAV ||
(sf_format & SF_FORMAT_TYPEMASK) == SF_FORMAT_WAVEX) { (sf_format & SF_FORMAT_TYPEMASK) == SF_FORMAT_WAVEX) {

View File

@ -869,8 +869,12 @@ void ControlToolBar::OnRecord(wxCommandEvent &evt)
for (Track *tt = it.First(); tt; tt = it.Next()) { for (Track *tt = it.First(); tt; tt = it.Next()) {
if (tt->GetKind() == Track::Wave && (tt->GetSelected() || !sel)) { if (tt->GetKind() == Track::Wave && (tt->GetSelected() || !sel)) {
WaveTrack *wt = static_cast<WaveTrack *>(tt); WaveTrack *wt = static_cast<WaveTrack *>(tt);
if (duplex) if (duplex) {
playbackTracks.Remove(wt); auto end = playbackTracks.end();
auto it = std::find(playbackTracks.begin(), end, wt);
if (it != end)
playbackTracks.erase(it);
}
t1 = wt->GetEndTime(); t1 = wt->GetEndTime();
if (t1 < t0) { if (t1 < t0) {
if (!tracksCopied) { if (!tracksCopied) {
@ -892,7 +896,7 @@ void ControlToolBar::OnRecord(wxCommandEvent &evt)
wxUnusedVar(bResult); wxUnusedVar(bResult);
delete newTrack; delete newTrack;
} }
newRecordingTracks.Add(wt); newRecordingTracks.push_back(wt);
} }
} }
@ -974,13 +978,13 @@ void ControlToolBar::OnRecord(wxCommandEvent &evt)
newTrack->SetChannel( Track::MonoChannel ); newTrack->SetChannel( Track::MonoChannel );
} }
newRecordingTracks.Add(newTrack); newRecordingTracks.push_back(newTrack);
} }
// msmeyer: StartStream calls a callback which triggers auto-save, so // msmeyer: StartStream calls a callback which triggers auto-save, so
// we add the tracks where recording is done into now. We remove them // we add the tracks where recording is done into now. We remove them
// later if starting the stream fails // later if starting the stream fails
for (unsigned int i = 0; i < newRecordingTracks.GetCount(); i++) for (unsigned int i = 0; i < newRecordingTracks.size(); i++)
t->Add(newRecordingTracks[i]); t->Add(newRecordingTracks[i]);
} }
@ -1020,7 +1024,7 @@ void ControlToolBar::OnRecord(wxCommandEvent &evt)
} }
else { else {
// msmeyer: Delete recently added tracks if opening stream fails // msmeyer: Delete recently added tracks if opening stream fails
for (unsigned int i = 0; i < newRecordingTracks.GetCount(); i++) { for (unsigned int i = 0; i < newRecordingTracks.size(); i++) {
t->Remove(newRecordingTracks[i]); t->Remove(newRecordingTracks[i]);
delete newRecordingTracks[i]; delete newRecordingTracks[i];
} }