windows-nt/Source/XPSP1/NT/multimedia/directx/dmusic/dmband/pchmap.cpp
2020-09-26 16:20:57 +08:00

110 lines
3.2 KiB
C++

// Copyright (c) 1998-1999 Microsoft Corporation
/* This is a class to manage tracking mutes for the SeqTrack and BandTrack. */
#include "PChMap.h"
#include "debug.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<PCHMAP_ITEM>* 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<PCHMAP_ITEM>* 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<PCHMAP_ITEM>(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)(rtTime / 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;
}