AudioIO.cpp does not depend on ProjectAudioIO.h and GetActiveProject

This commit is contained in:
Paul Licameli 2019-05-30 15:56:44 -04:00
parent e5cf2165d1
commit 850628275b
5 changed files with 28 additions and 23 deletions

View File

@ -455,7 +455,6 @@ TimeTrack and AudioIOListener and whether the playback is looped.
#include "prefs/GUISettings.h"
#include "Prefs.h"
#include "Project.h"
#include "ProjectAudioIO.h"
#include "TimeTrack.h"
#include "WaveTrack.h"
#include "AutoRecovery.h"
@ -1466,11 +1465,12 @@ static PaSampleFormat AudacityToPortAudioSampleFormat(sampleFormat format)
}
}
bool AudioIO::StartPortAudioStream(double sampleRate,
bool AudioIO::StartPortAudioStream(const AudioIOStartStreamOptions &options,
unsigned int numPlaybackChannels,
unsigned int numCaptureChannels,
sampleFormat captureFormat)
{
auto sampleRate = options.rate;
#ifdef EXPERIMENTAL_MIDI_OUT
mNumFrames = 0;
mNumPauseFrames = 0;
@ -1486,7 +1486,7 @@ bool AudioIO::StartPortAudioStream(double sampleRate,
mCallbackCount = 0;
mAudioFramesPerBuffer = 0;
#endif
mOwningProject = GetActiveProject();
mOwningProject = options.pProject;
// PRL: Protection from crash reported by David Bailes, involving starting
// and stopping with frequent changes of active window, hard to reproduce
@ -1560,7 +1560,7 @@ bool AudioIO::StartPortAudioStream(double sampleRate,
playbackParameters.suggestedLatency = isWASAPI ? 0.0 : latencyDuration/1000.0;
}
mOutputMeter = ProjectAudioIO::Get( *mOwningProject ).GetPlaybackMeter();
mOutputMeter = options.playbackMeter;
}
if( numCaptureChannels > 0)
@ -1590,8 +1590,7 @@ bool AudioIO::StartPortAudioStream(double sampleRate,
else
captureParameters.suggestedLatency = latencyDuration/1000.0;
SetCaptureMeter( mOwningProject,
ProjectAudioIO::Get( *mOwningProject ).GetCaptureMeter() );
SetCaptureMeter( mOwningProject, options.captureMeter );
}
SetMeters();
@ -1678,7 +1677,7 @@ wxString AudioIO::LastPaErrorString()
return wxString::Format(wxT("%d %s."), (int) mLastPaError, Pa_GetErrorText(mLastPaError));
}
void AudioIO::StartMonitoring(double sampleRate)
void AudioIO::StartMonitoring( const AudioIOStartStreamOptions &options )
{
if ( mPortStreamV19 || mStreamToken )
return;
@ -1696,7 +1695,7 @@ void AudioIO::StartMonitoring(double sampleRate)
// FIXME: TRAP_ERR StartPortAudioStream (a PaError may be present)
// but StartPortAudioStream function only returns true or false.
mUsingAlsa = false;
success = StartPortAudioStream(sampleRate, (unsigned int)playbackChannels,
success = StartPortAudioStream(options, (unsigned int)playbackChannels,
(unsigned int)captureChannels,
captureFormat);
@ -1738,8 +1737,6 @@ int AudioIO::StartStream(const TransportTracks &tracks,
if( IsBusy() )
return 0;
const auto &sampleRate = options.rate;
// We just want to set mStreamToken to -1 - this way avoids
// an extremely rare but possible race condition, if two functions
// somehow called StartStream at the same time...
@ -1802,7 +1799,7 @@ int AudioIO::StartStream(const TransportTracks &tracks,
mRecordingSchedule.mCrossfadeData.swap( *options.pCrossfadeData );
mListener = options.listener;
mRate = sampleRate;
mRate = options.rate;
mSeek = 0;
mLastRecordingOffset = 0;
@ -1877,7 +1874,7 @@ int AudioIO::StartStream(const TransportTracks &tracks,
bool successAudio;
successAudio = StartPortAudioStream(sampleRate, playbackChannels,
successAudio = StartPortAudioStream(options, playbackChannels,
captureChannels, captureFormat);
#ifdef EXPERIMENTAL_MIDI_OUT
@ -1902,7 +1899,7 @@ int AudioIO::StartStream(const TransportTracks &tracks,
return 0;
}
if ( ! AllocateBuffers( options, tracks, t0, t1, sampleRate, scrubbing ) )
if ( ! AllocateBuffers( options, tracks, t0, t1, options.rate, scrubbing ) )
return 0;
if (mNumPlaybackChannels > 0)
@ -2677,7 +2674,7 @@ void AudioIO::StopStream()
mInputMeter.Release();
mOutputMeter.Release();
mOwningProject = NULL;
mOwningProject = nullptr;
if (mListener && mNumCaptureChannels > 0)
mListener->OnAudioIOStopRecording();

View File

@ -116,8 +116,9 @@ using PRCrossfadeData = std::vector< std::vector < float > >;
struct AudioIOStartStreamOptions
{
explicit
AudioIOStartStreamOptions(double rate_)
: timeTrack(NULL)
AudioIOStartStreamOptions(AudacityProject *pProject_, double rate_)
: pProject{ pProject_ }
, timeTrack(NULL)
, listener(NULL)
, rate(rate_)
, playLooped(false)
@ -127,6 +128,8 @@ struct AudioIOStartStreamOptions
, preRoll(0.0)
{}
AudacityProject *pProject{};
MeterPanel *captureMeter{}, *playbackMeter{};
TimeTrack *timeTrack;
AudioIOListener* listener;
double rate;
@ -810,7 +813,7 @@ public:
* selected number of input channels to open the recording device and start
* reading input data. If software playthrough is enabled, it also opens
* the output device in stereo to play the data through */
void StartMonitoring(double sampleRate);
void StartMonitoring( const AudioIOStartStreamOptions &options );
/** \brief Start recording or playing back audio
*
@ -1101,7 +1104,7 @@ private:
* if necessary. The captureFormat is used for recording only, the playback
* being floating point always. Returns true if the stream opened sucessfully
* and false if it did not. */
bool StartPortAudioStream(double sampleRate,
bool StartPortAudioStream(const AudioIOStartStreamOptions &options,
unsigned int numPlaybackChannels,
unsigned int numCaptureChannels,
sampleFormat captureFormat);

View File

@ -1356,8 +1356,11 @@ void AudacityProject::ApplyUpdatedTheme()
AudioIOStartStreamOptions
DefaultPlayOptions( AudacityProject &project )
{
AudioIOStartStreamOptions options {
auto &projectAudioIO = ProjectAudioIO::Get( project );
AudioIOStartStreamOptions options { &project,
ProjectSettings::Get( project ).GetRate() };
options.captureMeter = projectAudioIO.GetCaptureMeter();
options.playbackMeter = projectAudioIO.GetPlaybackMeter();
options.timeTrack = TrackList::Get( project ).GetTimeTrack();
options.listener = &project;
return options;
@ -1366,12 +1369,15 @@ DefaultPlayOptions( AudacityProject &project )
AudioIOStartStreamOptions
DefaultSpeedPlayOptions( AudacityProject &project )
{
auto &projectAudioIO = ProjectAudioIO::Get( project );
auto PlayAtSpeedRate = gAudioIO->GetBestRate(
false, //not capturing
true, //is playing
ProjectSettings::Get( project ).GetRate() //suggested rate
);
AudioIOStartStreamOptions options{ PlayAtSpeedRate };
AudioIOStartStreamOptions options{ &project, PlayAtSpeedRate };
options.captureMeter = projectAudioIO.GetCaptureMeter();
options.playbackMeter = projectAudioIO.GetPlaybackMeter();
options.timeTrack = TrackList::Get( project ).GetTimeTrack();
options.listener = &project;
return options;

View File

@ -2624,7 +2624,7 @@ void Effect::Preview(bool dryOnly)
t1 = std::min(mT0 + previewLen, mT1);
// Start audio playing
AudioIOStartStreamOptions options { rate };
AudioIOStartStreamOptions options { nullptr, rate };
int token =
gAudioIO->StartStream(tracks, mT0, t1, options);

View File

@ -67,7 +67,6 @@
#include "../ImageManipulation.h"
#include "../prefs/GUISettings.h"
#include "../Project.h"
#include "../ProjectSettings.h"
#include "../Prefs.h"
#include "../ShuttleGui.h"
@ -1872,7 +1871,7 @@ void MeterPanel::StartMonitoring()
if (start && !gAudioIO->IsBusy()){
AudacityProject *p = GetActiveProject();
if (p){
gAudioIO->StartMonitoring( ProjectSettings::Get( *p ).GetRate());
gAudioIO->StartMonitoring( DefaultPlayOptions( *p ) );
}
mLayoutValid = false;