1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-08-16 08:34:10 +02:00

Committing patch from bug #794

This commit is contained in:
lllucius 2015-01-04 19:44:54 +00:00
parent 1201c5abe3
commit b9647586af
3 changed files with 50 additions and 19 deletions

View File

@ -282,7 +282,7 @@ bool RecordingRecoveryHandler::HandleXMLTag(const wxChar *tag,
return false; return false;
} }
WaveTrack* track = tracks.Item(index); WaveTrack* track = tracks.Item(index);
WaveClip* clip = track->GetLastOrCreateClip(); WaveClip* clip = track->NewestOrNewClip();
Sequence* seq = clip->GetSequence(); Sequence* seq = clip->GetSequence();
// Load the blockfile from the XML // Load the blockfile from the XML

View File

@ -1326,21 +1326,21 @@ bool WaveTrack::Append(samplePtr buffer, sampleFormat format,
sampleCount len, unsigned int stride /* = 1 */, sampleCount len, unsigned int stride /* = 1 */,
XMLWriter *blockFileLog /* = NULL */) XMLWriter *blockFileLog /* = NULL */)
{ {
return GetLastOrCreateClip()->Append(buffer, format, len, stride, return RightmostOrNewClip()->Append(buffer, format, len, stride,
blockFileLog); blockFileLog);
} }
bool WaveTrack::AppendAlias(wxString fName, sampleCount start, bool WaveTrack::AppendAlias(wxString fName, sampleCount start,
sampleCount len, int channel,bool useOD) sampleCount len, int channel,bool useOD)
{ {
return GetLastOrCreateClip()->AppendAlias(fName, start, len, channel,useOD); return RightmostOrNewClip()->AppendAlias(fName, start, len, channel, useOD);
} }
bool WaveTrack::AppendCoded(wxString fName, sampleCount start, bool WaveTrack::AppendCoded(wxString fName, sampleCount start,
sampleCount len, int channel, int decodeType) sampleCount len, int channel, int decodeType)
{ {
return GetLastOrCreateClip()->AppendCoded(fName, start, len, channel, decodeType); return RightmostOrNewClip()->AppendCoded(fName, start, len, channel, decodeType);
} }
///gets an int with OD flags so that we can determine which ODTasks should be run on this track after save/open, etc. ///gets an int with OD flags so that we can determine which ODTasks should be run on this track after save/open, etc.
@ -1401,12 +1401,13 @@ sampleCount WaveTrack::GetMaxBlockSize()
sampleCount WaveTrack::GetIdealBlockSize() sampleCount WaveTrack::GetIdealBlockSize()
{ {
return GetLastOrCreateClip()->GetSequence()->GetIdealBlockSize(); return NewestOrNewClip()->GetSequence()->GetIdealBlockSize();
} }
bool WaveTrack::Flush() bool WaveTrack::Flush()
{ {
return GetLastOrCreateClip()->Flush(); // After appending, presumably. Do this to the clip that gets appended.
return RightmostOrNewClip()->Flush();
} }
bool WaveTrack::HandleXMLTag(const wxChar *tag, const wxChar **attrs) bool WaveTrack::HandleXMLTag(const wxChar *tag, const wxChar **attrs)
@ -1491,7 +1492,7 @@ void WaveTrack::HandleXMLEndTag(const wxChar * WXUNUSED(tag))
{ {
// In case we opened a pre-multiclip project, we need to // In case we opened a pre-multiclip project, we need to
// simulate closing the waveclip tag. // simulate closing the waveclip tag.
GetLastOrCreateClip()->HandleXMLEndTag( wxT("waveclip") ); NewestOrNewClip()->HandleXMLEndTag(wxT("waveclip"));
} }
XMLTagHandler *WaveTrack::HandleXMLChild(const wxChar *tag) XMLTagHandler *WaveTrack::HandleXMLChild(const wxChar *tag)
@ -1502,13 +1503,13 @@ XMLTagHandler *WaveTrack::HandleXMLChild(const wxChar *tag)
if (!wxStrcmp(tag, wxT("sequence")) || !wxStrcmp(tag, wxT("envelope"))) if (!wxStrcmp(tag, wxT("sequence")) || !wxStrcmp(tag, wxT("envelope")))
{ {
// This is a legacy project, so set the cached offset // This is a legacy project, so set the cached offset
GetLastOrCreateClip()->SetOffset(mLegacyProjectFileOffset); NewestOrNewClip()->SetOffset(mLegacyProjectFileOffset);
// Legacy project file tracks are imported as one single wave clip // Legacy project file tracks are imported as one single wave clip
if (!wxStrcmp(tag, wxT("sequence"))) if (!wxStrcmp(tag, wxT("sequence")))
return GetLastOrCreateClip()->GetSequence(); return NewestOrNewClip()->GetSequence();
else if (!wxStrcmp(tag, wxT("envelope"))) else if (!wxStrcmp(tag, wxT("envelope")))
return GetLastOrCreateClip()->GetEnvelope(); return NewestOrNewClip()->GetEnvelope();
} }
// JKC... for 1.1.0, one step better than what we had, but still badly broken. // JKC... for 1.1.0, one step better than what we had, but still badly broken.
@ -1516,8 +1517,8 @@ XMLTagHandler *WaveTrack::HandleXMLChild(const wxChar *tag)
if( !wxStrcmp( tag, wxT("waveblock" ))) if( !wxStrcmp( tag, wxT("waveblock" )))
{ {
// This is a legacy project, so set the cached offset // This is a legacy project, so set the cached offset
GetLastOrCreateClip()->SetOffset(mLegacyProjectFileOffset); NewestOrNewClip()->SetOffset(mLegacyProjectFileOffset);
Sequence *pSeq = GetLastOrCreateClip()->GetSequence(); Sequence *pSeq = NewestOrNewClip()->GetSequence();
return pSeq; return pSeq;
} }
@ -1977,7 +1978,7 @@ WaveClip* WaveTrack::CreateClip()
return clip; return clip;
} }
WaveClip* WaveTrack::GetLastOrCreateClip() WaveClip* WaveTrack::NewestOrNewClip()
{ {
if (mClips.IsEmpty()) { if (mClips.IsEmpty()) {
WaveClip *clip = CreateClip(); WaveClip *clip = CreateClip();
@ -1988,6 +1989,29 @@ WaveClip* WaveTrack::GetLastOrCreateClip()
return mClips.GetLast()->GetData(); return mClips.GetLast()->GetData();
} }
WaveClip* WaveTrack::RightmostOrNewClip()
{
if (mClips.IsEmpty()) {
WaveClip *clip = CreateClip();
clip->SetOffset(mOffset);
return clip;
}
else
{
WaveClipList::compatibility_iterator it = GetClipIterator();
WaveClip *rightmost = it->GetData();
double maxOffset = rightmost->GetOffset();
for (it = it->GetNext(); it; it = it->GetNext())
{
WaveClip *clip = it->GetData();
double offset = clip->GetOffset();
if (maxOffset < offset)
maxOffset = offset, rightmost = clip;
}
return rightmost;
}
}
int WaveTrack::GetClipIndex(WaveClip* clip) int WaveTrack::GetClipIndex(WaveClip* clip)
{ {
return mClips.IndexOf(clip); return mClips.IndexOf(clip);

View File

@ -313,12 +313,19 @@ class AUDACITY_DLL_API WaveTrack: public Track {
// to the newly created clip. // to the newly created clip.
WaveClip* CreateClip(); WaveClip* CreateClip();
/** @brief Get access to the last clip, or create a clip, if there is not /** @brief Get access to the most recently added clip, or create a clip,
* already one. * if there is not already one. THIS IS NOT NECESSARILY RIGHTMOST.
* *
* @return a pointer to a WaveClip at the end of the track * @return a pointer to the most recently added WaveClip
*/ */
WaveClip* GetLastOrCreateClip(); WaveClip* NewestOrNewClip();
/** @brief Get access to the last (rightmost) clip, or create a clip,
* if there is not already one.
*
* @return a pointer to a WaveClip at the end of the track
*/
WaveClip* RightmostOrNewClip();
// Get the linear index of a given clip (-1 if the clip is not found) // Get the linear index of a given clip (-1 if the clip is not found)
int GetClipIndex(WaveClip* clip); int GetClipIndex(WaveClip* clip);