bool TrackMatchesGuid(MediaTrack* tr, const GUID* g) { if (tr && g) { if (GuidsEqual(GetTrackGUID(tr), g)) return true; // 2nd try for the master if (tr == GetMasterTrack(NULL)) return GuidsEqual(g, &GUID_NULL); } return false; }
bool RprTrack::operator==(RprTrack &rhs) { GUID *lhsGuid = getGUID(); GUID *rhsGuid = rhs.getGUID(); return GuidsEqual(lhsGuid,rhsGuid); }
void ActiveTakeTrack::Restore(MediaTrack* tr) { // TODO : if no matched items, return false and delete from level above??? if (m_items.GetSize() == 0 || !GetTrackNumMediaItems(tr)) return; bool* bUsed = new bool[m_items.GetSize()]; memset(bUsed, 0, sizeof(bool) * m_items.GetSize()); for (int i = 0; i < GetTrackNumMediaItems(tr); i++) { MediaItem* mi = GetTrackMediaItem(tr, i); GUID* g = (GUID*)GetSetMediaItemInfo(mi, "GUID", NULL); for (int j = 0; j < m_items.GetSize(); j++) { if (!bUsed[j] && GuidsEqual(g, &m_items.Get(j)->m_item)) { // TODO check this logic under a bunch of situs if (!m_items.Get(j)->Restore(mi)) m_items.Delete(j--, true); else bUsed[j] = true; break; } } } delete[] bUsed; }
bool ActiveTake::Restore(MediaItem* mi) { int i; for (i = 0; i < GetMediaItemNumTakes(mi); i++) if (GuidsEqual(&m_activeTake, (GUID*)GetSetMediaItemTakeInfo(GetMediaItemTake(mi, i), "GUID", NULL))) { GetSetMediaItemInfo(mi, "I_CURTAKE", &i); return true; } return false; }
void TrackSends::Build(MediaTrack* tr) { // Get the HW sends from the track object string const char* trackStr = SWS_GetSetObjectState(tr, NULL); char line[4096]; int pos = 0; while (GetChunkLine(trackStr, line, 4096, &pos, false)) { if (strncmp(line, "HWOUT", 5) == 0) m_hwSends.Add(new WDL_FastString(line)); } SWS_FreeHeapPtr(trackStr); // Get the track sends from the cooresponding track object string MediaTrack* pDest; int idx = 0; char searchStr[20]; sprintf(searchStr, "AUXRECV %d ", CSurf_TrackToID(tr, false) - 1); while ((pDest = (MediaTrack*)GetSetTrackSendInfo(tr, 0, idx++, "P_DESTTRACK", NULL))) { GUID guid = *(GUID*)GetSetMediaTrackInfo(pDest, "GUID", NULL); // Have we already parsed this particular dest track string? bool bParsed = false; for (int i = 0; i < m_sends.GetSize(); i++) if (GuidsEqual(m_sends.Get(i)->GetGuid(), &guid)) { bParsed = true; break; } if (bParsed) break; // We haven't parsed yet! trackStr = SWS_GetSetObjectState(pDest, NULL); pos = 0; while (GetChunkLine(trackStr, line, 4096, &pos, false)) { if (strncmp(line, searchStr, strlen(searchStr)) == 0) m_sends.Add(new TrackSend(&guid, line)); } SWS_FreeHeapPtr(trackStr); } }
// bUsed is an array of bools with size == m_selItems.GetSize(), used to "check off" when an item from that list is used // caller initializes bUsed void SelItems::Match(MediaTrack* tr, bool* bUsed) { PreventUIRefresh(1); int nbitems=GetTrackNumMediaItems(tr); for (int i = 0; i < nbitems; i++) { MediaItem* mi = GetTrackMediaItem(tr, i); GetSetMediaItemInfo(mi, "B_UISEL", &g_bFalse); GUID* g = (GUID*)GetSetMediaItemInfo(mi, "GUID", NULL); for (int j = 0; j < m_selItems.GetSize(); j++) if (!bUsed[j] && GuidsEqual(m_selItems.Get(j), g)) { bUsed[j] = true; GetSetMediaItemInfo(mi, "B_UISEL", &g_bTrue); break; } } PreventUIRefresh(-1); }
void RestoreLastSelItemTrack(COMMAND_T* ct) { PreventUIRefresh(1); for (int i = 1; i <= GetNumTracks(); i++) { MediaTrack* tr = CSurf_TrackFromID(i, false); if (*(int*)GetSetMediaTrackInfo(tr, "I_SELECTED", NULL)) { GUID* g = (GUID*)GetSetMediaTrackInfo(tr, "GUID", NULL); for (int j = 0; j < g_selItemsTrack.Get()->GetSize(); j++) if (GuidsEqual(g, &g_selItemsTrack.Get()->Get(j)->m_guid)) { g_selItemsTrack.Get()->Get(j)->PreviousSelection(tr); break; } } } PreventUIRefresh(-1); Undo_OnStateChangeEx(SWS_CMD_SHORTNAME(ct), UNDO_STATE_ITEMS, -1); UpdateArrange(); }
//***************************************************** // Global functions void SaveSelTrackSelItems(int iSlot) { for (int i = 1; i <= GetNumTracks(); i++) { MediaTrack* tr = CSurf_TrackFromID(i, false); if (*(int*)GetSetMediaTrackInfo(tr, "I_SELECTED", NULL)) { GUID* g = (GUID*)GetSetMediaTrackInfo(tr, "GUID", NULL); int j; for (j = 0; j < g_selItemsTrack.Get()->GetSize(); j++) if (GuidsEqual(g, &g_selItemsTrack.Get()->Get(j)->m_guid)) { g_selItemsTrack.Get()->Get(j)->Save(tr, iSlot); break; } if (j == g_selItemsTrack.Get()->GetSize()) { g_selItemsTrack.Get()->Add(new SelItemsTrack(tr)); g_selItemsTrack.Get()->Get(g_selItemsTrack.Get()->GetSize()-1)->Save(tr, iSlot); } } } }
void RestoreSelTrackSelItems(int iSlot) { PreventUIRefresh(1); for (int i = 1; i <= GetNumTracks(); i++) { MediaTrack* tr = CSurf_TrackFromID(i, false); if (*(int*)GetSetMediaTrackInfo(tr, "I_SELECTED", NULL)) { GUID* g = (GUID*)GetSetMediaTrackInfo(tr, "GUID", NULL); for (int j = 0; j < g_selItemsTrack.Get()->GetSize(); j++) if (GuidsEqual(g, &g_selItemsTrack.Get()->Get(j)->m_guid)) { g_selItemsTrack.Get()->Get(j)->Restore(tr, iSlot); break; } } } PreventUIRefresh(-1); char cUndoText[256]; sprintf(cUndoText, __LOCALIZE_VERFMT("Restore selected track(s) selected item(s), slot %d","sws_undo"), iSlot+1); Undo_OnStateChangeEx(cUndoText, UNDO_STATE_ITEMS, -1); UpdateArrange(); }
void TrackSends::UpdateReaper(MediaTrack* tr, WDL_PtrList<TrackSendFix>* pFix) { // First replace all the hw sends with the stored const char* trackStr = SWS_GetSetObjectState(tr, NULL); WDL_FastString newTrackStr; char line[4096]; int pos = 0; bool bChanged = false; while (GetChunkLine(trackStr, line, 4096, &pos, true)) { if (strncmp(line, "HWOUT", 5) != 0) newTrackStr.Append(line); else bChanged = true; } for (int i = 0; i < m_hwSends.GetSize(); i++) { bChanged = true; AppendChunkLine(&newTrackStr, m_hwSends.Get(i)->Get()); } SWS_FreeHeapPtr(trackStr); if (bChanged) SWS_GetSetObjectState(tr, &newTrackStr); // Check for destination track validity for (int i = 0; i < m_sends.GetSize(); i++) if (!GuidToTrack(m_sends.Get(i)->GetGuid())) { bool bFixed = false; if (pFix) { for (int j = 0; j < pFix->GetSize(); j++) if (GuidsEqual(&pFix->Get(j)->m_oldGuid, m_sends.Get(i)->GetGuid())) { m_sends.Get(i)->SetGuid(&pFix->Get(j)->m_newGuid); bFixed = true; break; } } if (!bFixed) { GUID newGuid = GUID_NULL; int iRet = ResolveMissingRecv(tr, i, m_sends.Get(i), pFix); if (iRet == 1) // Success! m_sends.Get(i)->SetGuid(&newGuid); else if (iRet == 2) // Delete { m_sends.Delete(i, true); i--; } } } // Now, delete any existing sends and add as necessary // Loop through each track char searchStr[20]; sprintf(searchStr, "AUXRECV %d", CSurf_TrackToID(tr, false) - 1); WDL_FastString sendStr; GUID* trGuid = (GUID*)GetSetMediaTrackInfo(tr, "GUID", NULL); for (int i = 1; i <= GetNumTracks(); i++) { MediaTrack* pDest = CSurf_TrackFromID(i, false); newTrackStr.Set(""); trackStr = NULL; MediaTrack* pSrc; int idx = 0; while ((pSrc = (MediaTrack*)GetSetTrackSendInfo(pDest, -1, idx++, "P_SRCTRACK", NULL))) if (pSrc == tr) { trackStr = SWS_GetSetObjectState(pDest, NULL); pos = 0; // Remove existing recvs from the src track while (GetChunkLine(trackStr, line, 4096, &pos, true)) { if (strncmp(line, searchStr, strlen(searchStr)) != 0) newTrackStr.Append(line); } break; } GUID guid = *(GUID*)GetSetMediaTrackInfo(pDest, "GUID", NULL); for (int i = 0; i < m_sends.GetSize(); i++) { if (GuidsEqual(&guid, m_sends.Get(i)->GetGuid()) && !GuidsEqual(&guid, trGuid)) { if (!trackStr) { trackStr = SWS_GetSetObjectState(pDest, NULL); newTrackStr.Set(trackStr); } AppendChunkLine(&newTrackStr, m_sends.Get(i)->AuxRecvString(tr, &sendStr)->Get()); } } if (trackStr) { SWS_GetSetObjectState(pDest, &newTrackStr); SWS_FreeHeapPtr(trackStr); } } }