1
0
mirror of https://github.com/cookiengineer/audacity synced 2026-01-13 16:15:48 +01:00

Group arguments to StartStream, and a bit less of #ifdef for MIDI play...

... And pull choice of tracks and options out of DoRecord
This commit is contained in:
Paul Licameli
2018-05-28 20:44:37 -04:00
parent 0635f8802b
commit 35a97e09e7
7 changed files with 103 additions and 106 deletions

View File

@@ -686,13 +686,7 @@ int ControlToolBar::PlayPlayRegion(const SelectedRegion &selectedRegion,
myOptions.cutPreviewGapStart = t0;
myOptions.cutPreviewGapLen = t1 - t0;
token = gAudioIO->StartStream(
mCutPreviewTracks->GetWaveTrackConstArray(false),
WaveTrackArray(),
#ifdef EXPERIMENTAL_MIDI_OUT
useMidi
? mCutPreviewTracks->GetNoteTrackArray(false)
: NoteTrackArray(),
#endif
GetAllPlaybackTracks(*mCutPreviewTracks, false, useMidi),
tcp0, tcp1, myOptions);
}
else
@@ -706,14 +700,9 @@ int ControlToolBar::PlayPlayRegion(const SelectedRegion &selectedRegion,
timetrack = t->GetTimeTrack();
}
*/
token = gAudioIO->StartStream(t->GetWaveTrackConstArray(false),
WaveTrackArray(),
#ifdef EXPERIMENTAL_MIDI_OUT
useMidi
? t->GetNoteTrackArray(false)
: NoteTrackArray(),
#endif
t0, t1, options);
token = gAudioIO->StartStream(
GetAllPlaybackTracks(*t, false, useMidi),
t0, t1, options);
}
if (token != 0) {
success = true;
@@ -1079,22 +1068,29 @@ void ControlToolBar::OnRecord(wxCommandEvent &evt)
}
}
success = DoRecord(*p, existingTracks, t0, t1);
TransportTracks transportTracks;
if (UseDuplex()) {
// Remove recording tracks from the list of tracks for duplex ("overdub")
// playback.
/* TODO: set up stereo tracks if that is how the user has set up
* their preferences, and choose sample format based on prefs */
transportTracks = GetAllPlaybackTracks(*p->GetTracks(), false, true);
for (const auto &wt : existingTracks) {
auto end = transportTracks.playbackTracks.end();
auto it = std::find(transportTracks.playbackTracks.begin(), end, wt);
if (it != end)
transportTracks.playbackTracks.erase(it);
}
}
transportTracks.captureTracks = existingTracks;
AudioIOStartStreamOptions options(p->GetDefaultPlayOptions());
success = DoRecord(*p, transportTracks, t0, t1, options);
}
}
bool ControlToolBar::DoRecord(AudacityProject &project, WaveTrackArray &existingTracks, double t0, double t1)
bool ControlToolBar::UseDuplex()
{
const auto p = &project;
bool success = false;
/* TODO: set up stereo tracks if that is how the user has set up
* their preferences, and choose sample format based on prefs */
WaveTrackConstArray playbackTracks;
#ifdef EXPERIMENTAL_MIDI_OUT
NoteTrackArray midiTracks;
#endif
bool duplex;
gPrefs->Read(wxT("/AudioIO/Duplex"), &duplex,
#ifdef EXPERIMENTAL_DA
@@ -1103,39 +1099,30 @@ bool ControlToolBar::DoRecord(AudacityProject &project, WaveTrackArray &existing
true
#endif
);
return duplex;
}
if (duplex){
TrackList *trackList = p->GetTracks();
playbackTracks = trackList->GetWaveTrackConstArray(false);
#ifdef EXPERIMENTAL_MIDI_OUT
midiTracks = trackList->GetNoteTrackArray(false);
#endif
}
else {
playbackTracks = WaveTrackConstArray();
#ifdef EXPERIMENTAL_MIDI_OUT
midiTracks = NoteTrackArray();
#endif
}
bool ControlToolBar::DoRecord(AudacityProject &project,
const TransportTracks &tracks,
double t0, double t1,
const AudioIOStartStreamOptions &options)
{
auto transportTracks = tracks;
bool appendRecord = !existingTracks.empty();
// Will replace any given capture tracks with temporaries
transportTracks.captureTracks.clear();
const auto p = &project;
bool success = false;
bool appendRecord = !tracks.captureTracks.empty();
{
WaveTrackArray recordingTracks;
if (appendRecord) {
// Append recording:
// Pad selected/all wave tracks to make them all the same length
// Remove recording tracks from the list of tracks for duplex ("overdub")
// playback.
for (const auto &wt : existingTracks)
for (const auto &wt : tracks.captureTracks)
{
if (duplex) {
auto end = playbackTracks.end();
auto it = std::find(playbackTracks.begin(), end, wt);
if (it != end)
playbackTracks.erase(it);
}
t1 = wt->GetEndTime();
// A function that copies all the non-sample data between
@@ -1167,7 +1154,7 @@ bool ControlToolBar::DoRecord(AudacityProject &project, WaveTrackArray &existing
pending->Clear(t1, t0);
pending->Paste(t1, newTrack.get());
}
recordingTracks.push_back(pending);
transportTracks.captureTracks.push_back(pending);
}
if (t1 <= p->GetSel0() && p->GetSel1() > p->GetSel0()) {
@@ -1177,7 +1164,7 @@ bool ControlToolBar::DoRecord(AudacityProject &project, WaveTrackArray &existing
}
}
if( recordingTracks.empty() )
if( transportTracks.captureTracks.empty() )
{ // recording to NEW track(s).
bool recordingNameCustom, useTrackNumber, useDateStamp, useTimeStamp;
wxString defaultTrackName, defaultRecordingTrackName;
@@ -1268,7 +1255,7 @@ bool ControlToolBar::DoRecord(AudacityProject &project, WaveTrackArray &existing
}
p->GetTracks()->RegisterPendingNewTrack( newTrack );
recordingTracks.push_back( newTrack );
transportTracks.captureTracks.push_back(newTrack);
// Bug 1548. New track needs the focus.
p->GetTrackPanel()->SetFocusedTrack( newTrack.get() );
}
@@ -1279,13 +1266,7 @@ bool ControlToolBar::DoRecord(AudacityProject &project, WaveTrackArray &existing
gAudioIO->AILAInitialize();
#endif
AudioIOStartStreamOptions options(p->GetDefaultPlayOptions());
int token = gAudioIO->StartStream(playbackTracks,
recordingTracks,
#ifdef EXPERIMENTAL_MIDI_OUT
midiTracks,
#endif
t0, t1, options);
int token = gAudioIO->StartStream(transportTracks, t0, t1, options);
success = (token != 0);

View File

@@ -41,6 +41,8 @@ enum class PlayMode : int;
class WaveTrack;
using WaveTrackArray = std::vector < std::shared_ptr < WaveTrack > >;
struct TransportTracks;
// In the GUI, ControlToolBar appears as the "Transport Toolbar". "Control Toolbar" is historic.
class ControlToolBar final : public ToolBar {
@@ -55,7 +57,9 @@ class ControlToolBar final : public ToolBar {
void OnKeyEvent(wxKeyEvent & event);
// Find suitable tracks to record into, or return an empty array.
WaveTrackArray ChooseExistingRecordingTracks(AudacityProject &proj, bool selectedOnly);
static WaveTrackArray ChooseExistingRecordingTracks(AudacityProject &proj, bool selectedOnly);
static bool UseDuplex();
// msmeyer: These are public, but it's far better to
// call the "real" interface functions like PlayCurrentRegion() and
@@ -64,7 +68,10 @@ class ControlToolBar final : public ToolBar {
void OnPlay(wxCommandEvent & evt);
void OnStop(wxCommandEvent & evt);
void OnRecord(wxCommandEvent & evt);
bool DoRecord(AudacityProject &project, WaveTrackArray &existingTracks, double t0, double t1);
bool DoRecord(AudacityProject &project,
const TransportTracks &transportTracks, // If captureTracks is empty, then tracks are created
double t0, double t1,
const AudioIOStartStreamOptions &options);
void OnFF(wxCommandEvent & evt);
void OnPause(wxCommandEvent & evt);