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:
parent
af7cb40975
commit
43790cfa56
@ -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)*
|
||||||
|
@ -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();
|
||||||
|
|
||||||
|
27
src/Mix.cpp
27
src/Mix.cpp
@ -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;
|
||||||
|
|
||||||
|
15
src/Mix.h
15
src/Mix.h
@ -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;
|
||||||
|
@ -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]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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,48 +1219,34 @@ 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;
|
{
|
||||||
*num = 0;
|
Array waveTrackArray;
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
|
19
src/Track.h
19
src/Track.h
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -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() )
|
||||||
{
|
{
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
{
|
{
|
||||||
|
@ -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];
|
||||||
|
@ -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;
|
||||||
{
|
{
|
||||||
|
@ -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) {
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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(),
|
||||||
|
@ -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) {
|
||||||
|
@ -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];
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user