1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-20 14:20:06 +02:00

One less indirection for arrays of capture and playback tracks

This commit is contained in:
Paul Licameli 2016-08-05 00:32:45 -04:00
parent 71efb13161
commit 27527ebf5c
4 changed files with 58 additions and 61 deletions

View File

@ -974,9 +974,6 @@ bool AudioIO::ValidateDeviceNames(const wxString &play, const wxString &rec)
AudioIO::AudioIO() AudioIO::AudioIO()
{ {
mCaptureTracks = new WaveTrackArray;
mPlaybackTracks = new WaveTrackArray;
mAudioThreadShouldCallFillBuffersOnce = false; mAudioThreadShouldCallFillBuffersOnce = false;
mAudioThreadFillBuffersLoopRunning = false; mAudioThreadFillBuffersLoopRunning = false;
mAudioThreadFillBuffersLoopActive = false; mAudioThreadFillBuffersLoopActive = false;
@ -1113,8 +1110,6 @@ AudioIO::~AudioIO()
delete mScrubQueue; delete mScrubQueue;
#endif #endif
delete mCaptureTracks;
delete mPlaybackTracks;
} }
void AudioIO::SetMixer(int inputSource) void AudioIO::SetMixer(int inputSource)
@ -1688,8 +1683,8 @@ int AudioIO::StartStream(const WaveTrackArray &playbackTracks,
mTime = t0; mTime = t0;
mSeek = 0; mSeek = 0;
mLastRecordingOffset = 0; mLastRecordingOffset = 0;
*mCaptureTracks = captureTracks; mCaptureTracks = captureTracks;
*mPlaybackTracks = playbackTracks; mPlaybackTracks = playbackTracks;
#ifdef EXPERIMENTAL_MIDI_OUT #ifdef EXPERIMENTAL_MIDI_OUT
mMidiPlaybackTracks = midiPlaybackTracks; mMidiPlaybackTracks = midiPlaybackTracks;
#endif #endif
@ -1711,7 +1706,7 @@ int AudioIO::StartStream(const WaveTrackArray &playbackTracks,
{ {
const auto &scrubOptions = *options.pScrubbingOptions; const auto &scrubOptions = *options.pScrubbingOptions;
if (mCaptureTracks->size() > 0 || if (mCaptureTracks.size() > 0 ||
mPlayMode == PLAY_LOOPED || mPlayMode == PLAY_LOOPED ||
mTimeTrack != NULL || mTimeTrack != NULL ||
scrubOptions.maxSpeed < ScrubbingOptions::MinAllowedScrubSpeed()) { scrubOptions.maxSpeed < ScrubbingOptions::MinAllowedScrubSpeed()) {
@ -1767,8 +1762,8 @@ int AudioIO::StartStream(const 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->size()); mCaptureRingBufferSecs = 4.5 + 0.5 * std::min(size_t(16), mCaptureTracks.size());
mMinCaptureSecsToCopy = 0.2 + 0.2 * std::min(size_t(16), mCaptureTracks->size()); 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;
@ -1783,7 +1778,7 @@ int AudioIO::StartStream(const WaveTrackArray &playbackTracks,
if( captureTracks.size() > 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->size(); 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
@ -1792,7 +1787,7 @@ int AudioIO::StartStream(const WaveTrackArray &playbackTracks,
// we would set the sound card to capture in 16 bits and the second // we would set the sound card to capture in 16 bits and the second
// track wouldn't get the benefit of all 24 bits the card is capable // track wouldn't get the benefit of all 24 bits the card is capable
// of. // of.
captureFormat = (*mCaptureTracks)[0]->GetSampleFormat(); captureFormat = mCaptureTracks[0]->GetSampleFormat();
// Tell project that we are about to start recording // Tell project that we are about to start recording
if (mListener) if (mListener)
@ -1849,12 +1844,12 @@ int AudioIO::StartStream(const WaveTrackArray &playbackTracks,
sampleCount playbackMixBufferSize = sampleCount playbackMixBufferSize =
(sampleCount)mPlaybackSamplesToCopy; (sampleCount)mPlaybackSamplesToCopy;
mPlaybackBuffers = new RingBuffer* [mPlaybackTracks->size()]; mPlaybackBuffers = new RingBuffer* [mPlaybackTracks.size()];
mPlaybackMixers = new Mixer* [mPlaybackTracks->size()]; 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->size()); memset(mPlaybackBuffers, 0, sizeof(RingBuffer*)*mPlaybackTracks.size());
memset(mPlaybackMixers, 0, sizeof(Mixer*)*mPlaybackTracks->size()); memset(mPlaybackMixers, 0, sizeof(Mixer*)*mPlaybackTracks.size());
const Mixer::WarpOptions &warpOptions = const Mixer::WarpOptions &warpOptions =
#ifdef EXPERIMENTAL_SCRUBBING_SUPPORT #ifdef EXPERIMENTAL_SCRUBBING_SUPPORT
@ -1866,12 +1861,12 @@ int AudioIO::StartStream(const WaveTrackArray &playbackTracks,
#endif #endif
Mixer::WarpOptions(mTimeTrack); Mixer::WarpOptions(mTimeTrack);
for (unsigned int i = 0; i < mPlaybackTracks->size(); 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(WaveTrackConstArray{ (*mPlaybackTracks)[i] }, mPlaybackMixers[i] = new Mixer(WaveTrackConstArray{ mPlaybackTracks[i] },
warpOptions, warpOptions,
mT0, mT1, 1, mT0, mT1, 1,
playbackMixBufferSize, false, playbackMixBufferSize, false,
@ -1895,17 +1890,17 @@ int AudioIO::StartStream(const WaveTrackArray &playbackTracks,
return 0; return 0;
} }
mCaptureBuffers = new RingBuffer* [mCaptureTracks->size()]; mCaptureBuffers = new RingBuffer* [mCaptureTracks.size()];
mResample = new Resample* [mCaptureTracks->size()]; 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->size()); memset(mCaptureBuffers, 0, sizeof(RingBuffer*)*mCaptureTracks.size());
memset(mResample, 0, sizeof(Resample*)*mCaptureTracks->size()); memset(mResample, 0, sizeof(Resample*)*mCaptureTracks.size());
for( unsigned int i = 0; i < mCaptureTracks->size(); 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 );
mResample[i] = new Resample(true, mFactor, mFactor); // constant rate resampling mResample[i] = new Resample(true, mFactor, mFactor); // constant rate resampling
} }
@ -1945,9 +1940,9 @@ int AudioIO::StartStream(const 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->size(); i < cnt; i++) for (size_t i = 0, cnt = mPlaybackTracks.size(); i < cnt; i++)
{ {
WaveTrack *vt = (*gAudioIO->mPlaybackTracks)[i]; WaveTrack *vt = gAudioIO->mPlaybackTracks[i];
int chanCnt = 1; int chanCnt = 1;
if (vt->GetLinked()) if (vt->GetLinked())
@ -1969,7 +1964,7 @@ int AudioIO::StartStream(const 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->size(); 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)
@ -2083,7 +2078,7 @@ void AudioIO::StartStreamCleanup(bool bOnlyBuffers)
if(mPlaybackBuffers) if(mPlaybackBuffers)
{ {
for (unsigned int i = 0; i < mPlaybackTracks->size(); i++) for (unsigned int i = 0; i < mPlaybackTracks.size(); i++)
delete mPlaybackBuffers[i]; delete mPlaybackBuffers[i];
delete [] mPlaybackBuffers; delete [] mPlaybackBuffers;
mPlaybackBuffers = NULL; mPlaybackBuffers = NULL;
@ -2091,7 +2086,7 @@ void AudioIO::StartStreamCleanup(bool bOnlyBuffers)
if(mPlaybackMixers) if(mPlaybackMixers)
{ {
for (unsigned int i = 0; i < mPlaybackTracks->size(); i++) for (unsigned int i = 0; i < mPlaybackTracks.size(); i++)
delete mPlaybackMixers[i]; delete mPlaybackMixers[i];
delete [] mPlaybackMixers; delete [] mPlaybackMixers;
mPlaybackMixers = NULL; mPlaybackMixers = NULL;
@ -2099,7 +2094,7 @@ void AudioIO::StartStreamCleanup(bool bOnlyBuffers)
if(mCaptureBuffers) if(mCaptureBuffers)
{ {
for (unsigned int i = 0; i < mCaptureTracks->size(); i++) for (unsigned int i = 0; i < mCaptureTracks.size(); i++)
delete mCaptureBuffers[i]; delete mCaptureBuffers[i];
delete [] mCaptureBuffers; delete [] mCaptureBuffers;
mCaptureBuffers = NULL; mCaptureBuffers = NULL;
@ -2107,7 +2102,7 @@ void AudioIO::StartStreamCleanup(bool bOnlyBuffers)
if(mResample) if(mResample)
{ {
for (unsigned int i = 0; i < mCaptureTracks->size(); i++) for (unsigned int i = 0; i < mCaptureTracks.size(); i++)
delete mResample[i]; delete mResample[i];
delete [] mResample; delete [] mResample;
mResample = NULL; mResample = NULL;
@ -2440,9 +2435,9 @@ void AudioIO::StopStream()
// we allocated in StartStream() // we allocated in StartStream()
// //
if (mPlaybackTracks->size() > 0) if (mPlaybackTracks.size() > 0)
{ {
for (unsigned int i = 0; i < mPlaybackTracks->size(); i++) for (unsigned int i = 0; i < mPlaybackTracks.size(); i++)
{ {
delete mPlaybackBuffers[i]; delete mPlaybackBuffers[i];
delete mPlaybackMixers[i]; delete mPlaybackMixers[i];
@ -2455,7 +2450,7 @@ void AudioIO::StopStream()
// //
// Offset all recorded tracks to account for latency // Offset all recorded tracks to account for latency
// //
if (mCaptureTracks->size() > 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
@ -2470,15 +2465,15 @@ void AudioIO::StopStream()
double recordingOffset = double recordingOffset =
mLastRecordingOffset + latencyCorrection / 1000.0; mLastRecordingOffset + latencyCorrection / 1000.0;
for (unsigned int i = 0; i < mCaptureTracks->size(); i++) for (unsigned int i = 0; i < mCaptureTracks.size(); i++)
{ {
delete mCaptureBuffers[i]; delete mCaptureBuffers[i];
delete mResample[i]; delete mResample[i];
WaveTrack* track = (*mCaptureTracks)[i]; WaveTrack* track = mCaptureTracks[i];
track->Flush(); track->Flush();
if (mPlaybackTracks->size() > 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();
@ -3068,7 +3063,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->size(); i++) for (i = 1; i < mPlaybackTracks.size(); i++)
{ {
int thisBlockAvail = mPlaybackBuffers[i]->AvailForPut(); int thisBlockAvail = mPlaybackBuffers[i]->AvailForPut();
@ -3084,7 +3079,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->size(); i++) for (i = 1; i < mCaptureTracks.size(); i++)
{ {
int avail = mCaptureBuffers[i]->AvailForGet(); int avail = mCaptureBuffers[i]->AvailForGet();
if( avail < commonlyAvail ) if( avail < commonlyAvail )
@ -3469,7 +3464,7 @@ void AudioIO::FillBuffers()
{ {
unsigned int i; unsigned int i;
if (mPlaybackTracks->size() > 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
@ -3536,7 +3531,7 @@ void AudioIO::FillBuffers()
if (!progress) if (!progress)
frames = available; frames = available;
for (i = 0; i < mPlaybackTracks->size(); 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
@ -3607,7 +3602,7 @@ void AudioIO::FillBuffers()
startTime = startSample / mRate; startTime = startSample / mRate;
endTime = endSample / mRate; endTime = endSample / mRate;
speed = double(std::abs(endSample - startSample)) / mScrubDuration; speed = double(std::abs(endSample - startSample)) / mScrubDuration;
for (i = 0; i < mPlaybackTracks->size(); i++) for (i = 0; i < mPlaybackTracks.size(); i++)
mPlaybackMixers[i]->SetTimesAndSpeed(startTime, endTime, speed); mPlaybackMixers[i]->SetTimesAndSpeed(startTime, endTime, speed);
} }
} }
@ -3622,7 +3617,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->size(); i++) for (i = 0; i < mPlaybackTracks.size(); i++)
mPlaybackMixers[i]->Restart(); mPlaybackMixers[i]->Restart();
mWarpedTime = 0.0; mWarpedTime = 0.0;
} }
@ -3636,7 +3631,7 @@ void AudioIO::FillBuffers()
} }
} // end of playback buffering } // end of playback buffering
if (mCaptureTracks->size() > 0) // start record buffering if (mCaptureTracks.size() > 0) // start record buffering
{ {
int commonlyAvail = GetCommonlyAvailCapture(); int commonlyAvail = GetCommonlyAvailCapture();
@ -3651,12 +3646,12 @@ 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->size(); int numChannels = mCaptureTracks.size();
for( i = 0; (int)i < numChannels; i++ ) for( i = 0; (int)i < numChannels; i++ )
{ {
int avail = commonlyAvail; int avail = commonlyAvail;
sampleFormat trackFormat = (*mCaptureTracks)[i]->GetSampleFormat(); sampleFormat trackFormat = mCaptureTracks[i]->GetSampleFormat();
AutoSaveFile appendLog; AutoSaveFile appendLog;
@ -3664,7 +3659,7 @@ void AudioIO::FillBuffers()
{ {
SampleBuffer temp(avail, trackFormat); SampleBuffer temp(avail, trackFormat);
mCaptureBuffers[i]->Get (temp.ptr(), trackFormat, avail); mCaptureBuffers[i]->Get (temp.ptr(), trackFormat, avail);
(*mCaptureTracks)[i]-> Append(temp.ptr(), trackFormat, avail, 1, mCaptureTracks[i]-> Append(temp.ptr(), trackFormat, avail, 1,
&appendLog); &appendLog);
} }
else else
@ -3679,14 +3674,14 @@ void AudioIO::FillBuffers()
*/ */
size = mResample[i]->Process(mFactor, (float *)temp1.ptr(), avail, !IsStreamActive(), size = mResample[i]->Process(mFactor, (float *)temp1.ptr(), avail, !IsStreamActive(),
&size, (float *)temp2.ptr(), size); &size, (float *)temp2.ptr(), size);
(*mCaptureTracks)[i]-> Append(temp2.ptr(), floatSample, size, 1, mCaptureTracks[i]-> Append(temp2.ptr(), floatSample, size, 1,
&appendLog); &appendLog);
} }
if (!appendLog.IsEmpty()) if (!appendLog.IsEmpty())
{ {
blockFileLog.StartTag(wxT("recordingrecovery")); blockFileLog.StartTag(wxT("recordingrecovery"));
blockFileLog.WriteAttr(wxT("id"), (*mCaptureTracks)[i]->GetAutoSaveIdent()); blockFileLog.WriteAttr(wxT("id"), mCaptureTracks[i]->GetAutoSaveIdent());
blockFileLog.WriteAttr(wxT("channel"), (int)i); blockFileLog.WriteAttr(wxT("channel"), (int)i);
blockFileLog.WriteAttr(wxT("numchannels"), numChannels); blockFileLog.WriteAttr(wxT("numchannels"), numChannels);
blockFileLog.WriteSubTree(appendLog); blockFileLog.WriteSubTree(appendLog);
@ -3879,10 +3874,10 @@ bool AudioIO::SetHasSolo(bool hasSolo)
void AudioIO::FillMidiBuffers() void AudioIO::FillMidiBuffers()
{ {
bool hasSolo = false; bool hasSolo = false;
int numPlaybackTracks = gAudioIO->mPlaybackTracks->size(); int numPlaybackTracks = gAudioIO->mPlaybackTracks.size();
int t; int t;
for(t = 0; t < numPlaybackTracks; t++ ) for(t = 0; t < numPlaybackTracks; t++ )
if( (*gAudioIO->mPlaybackTracks)[t]->GetSolo() ) { if( gAudioIO->mPlaybackTracks[t]->GetSolo() ) {
hasSolo = true; hasSolo = true;
break; break;
} }
@ -4160,7 +4155,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->size(); 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)*
@ -4351,7 +4346,7 @@ int audacityAudioCallback(const void *inputBuffer, void *outputBuffer,
int numSolo = 0; int numSolo = 0;
for( t = 0; t < numPlaybackTracks; t++ ) for( t = 0; t < numPlaybackTracks; t++ )
if( (*gAudioIO->mPlaybackTracks)[t]->GetSolo() ) if( gAudioIO->mPlaybackTracks[t]->GetSolo() )
numSolo++; numSolo++;
#ifdef EXPERIMENTAL_MIDI_OUT #ifdef EXPERIMENTAL_MIDI_OUT
int numMidiPlaybackTracks = gAudioIO->mMidiPlaybackTracks.size(); int numMidiPlaybackTracks = gAudioIO->mMidiPlaybackTracks.size();
@ -4376,7 +4371,7 @@ int audacityAudioCallback(const void *inputBuffer, void *outputBuffer,
int maxLen = 0; int maxLen = 0;
for (t = 0; t < numPlaybackTracks; t++) for (t = 0; t < numPlaybackTracks; t++)
{ {
WaveTrack *vt = (*gAudioIO->mPlaybackTracks)[t]; WaveTrack *vt = gAudioIO->mPlaybackTracks[t];
chans[chanCnt] = vt; chans[chanCnt] = vt;

View File

@ -17,6 +17,8 @@
#include "Audacity.h" #include "Audacity.h"
#include "Experimental.h" #include "Experimental.h"
#include <vector>
#ifdef USE_MIDI #ifdef USE_MIDI
#ifdef EXPERIMENTAL_MIDI_OUT #ifdef EXPERIMENTAL_MIDI_OUT
@ -24,7 +26,6 @@
#include "porttime.h" #include "porttime.h"
#include "allegro.h" #include "allegro.h"
#include <vector>
class NoteTrack; class NoteTrack;
using NoteTrackArray = std::vector < NoteTrack* >; using NoteTrackArray = std::vector < NoteTrack* >;
@ -53,7 +54,9 @@ class SelectedRegion;
class TimeTrack; class TimeTrack;
class AudacityProject; class AudacityProject;
class WaveTrackArray;
class WaveTrack;
using WaveTrackArray = std::vector < WaveTrack* >;
extern AUDACITY_DLL_API AudioIO *gAudioIO; extern AUDACITY_DLL_API AudioIO *gAudioIO;
@ -551,9 +554,9 @@ private:
#endif #endif
Resample **mResample; Resample **mResample;
RingBuffer **mCaptureBuffers; RingBuffer **mCaptureBuffers;
WaveTrackArray *mCaptureTracks; WaveTrackArray mCaptureTracks;
RingBuffer **mPlaybackBuffers; RingBuffer **mPlaybackBuffers;
WaveTrackArray *mPlaybackTracks; WaveTrackArray mPlaybackTracks;
Mixer **mPlaybackMixers; Mixer **mPlaybackMixers;
volatile int mStreamToken; volatile int mStreamToken;

View File

@ -92,7 +92,6 @@ class MixerBoardFrame;
struct AudioIOStartStreamOptions; struct AudioIOStartStreamOptions;
struct UndoState; struct UndoState;
class WaveTrackArray;
class Regions; class Regions;
class LWSlider; class LWSlider;

View File

@ -41,8 +41,8 @@ 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);
class WaveTrackArray : public std::vector < WaveTrack* > { using WaveTrackArray = std::vector < WaveTrack* > ;
};
class WaveTrackConstArray : public std::vector < const WaveTrack* > { class WaveTrackConstArray : public std::vector < const WaveTrack* > {
public: public:
WaveTrackConstArray() {} WaveTrackConstArray() {}