// Copyright (c) 1998-1999 Microsoft Corporation /* This is a class to manage tracking mutes for the SeqTrack and BandTrack. */ #include "PChMap.h" #include "dmusicf.h" CPChMap::CPChMap() { } CPChMap::~CPChMap() { } // Reset sets all item's mtNext time values to -1, so they are gotten again. void CPChMap::Reset(void) { TListItem* pItem; for( pItem = m_PChMapList.GetHead(); pItem; pItem = pItem->GetNext() ) { PCHMAP_ITEM& rItem = pItem->GetItemValue(); rItem.mtNext = -1; rItem.dwPChMap = rItem.dwPChannel; rItem.fMute = 0; } } // GetInfo calls the performance's GetData to get the current Mute Track information. // Reset() will be called upon any invalidation or seek, which will set the // internal times to -1 so this will be accurate in case of a new controlling segment. // You must provide the pfMute and pdwNewPCh parameters to this function, or // it will crash. void CPChMap::GetInfo( DWORD dwPCh, MUSIC_TIME mtTime, MUSIC_TIME mtOffset, DWORD dwGroupBits, IDirectMusicPerformance* pPerf, BOOL* pfMute, DWORD* pdwNewPCh, BOOL fClockTime ) { TListItem* pItem; for( pItem = m_PChMapList.GetHead(); pItem; pItem = pItem->GetNext() ) { PCHMAP_ITEM& rCheck = pItem->GetItemValue(); if( rCheck.dwPChannel == dwPCh ) break; } if( NULL == pItem ) { PCHMAP_ITEM item; item.mtNext = -1; item.dwPChannel = item.dwPChMap = dwPCh; item.fMute = FALSE; pItem = new TListItem(item); if( NULL == pItem ) { // error, out of memory. *pfMute = FALSE; *pdwNewPCh = dwPCh; return; } m_PChMapList.AddHead(pItem); } PCHMAP_ITEM& rItem = pItem->GetItemValue(); if( mtTime >= rItem.mtNext ) { DMUS_MUTE_PARAM muteParam; MUSIC_TIME mtNext; muteParam.dwPChannel = dwPCh; if (fClockTime) { MUSIC_TIME mtMusic; REFERENCE_TIME rtTime = (mtTime + mtOffset) * 10000; pPerf->ReferenceToMusicTime(rtTime,&mtMusic); if( SUCCEEDED(pPerf->GetParam( GUID_MuteParam, dwGroupBits, 0, mtMusic, &mtNext, (void*)&muteParam ))) { REFERENCE_TIME rtNext; // Convert to absolute reference time. pPerf->MusicToReferenceTime(mtNext + mtMusic,&rtNext); rtNext -= rtTime; // Subtract out to get the delta. rItem.mtNext = (MUSIC_TIME)(rtNext / 10000); // Convert to delta in milliseconds. BUGBUG What if there's a tempo change? rItem.dwPChMap = muteParam.dwPChannelMap; rItem.fMute = muteParam.fMute; } else { // no mute track, or no mute on this pchannel. // keep the current mapping. rItem.mtNext = 0x7fffffff; } } else { if( SUCCEEDED(pPerf->GetParam( GUID_MuteParam, dwGroupBits, 0, mtTime + mtOffset, &mtNext, (void*)&muteParam ))) { rItem.mtNext = mtNext; rItem.dwPChMap = muteParam.dwPChannelMap; rItem.fMute = muteParam.fMute; } else { // no mute track, or no mute on this pchannel. // keep the current mapping. rItem.mtNext = 0x7fffffff; } } } *pfMute = rItem.fMute; *pdwNewPCh = rItem.dwPChMap; }