Files
reman3/Rayman_X/cpa/tempgrp/SND/src/Win95/Supervis99/VoicesPage.cpp
2024-09-18 02:33:44 +08:00

359 lines
9.8 KiB
C++

// VoicesPage.cpp : implementation file
//
#include "stdafx.h"
#include "supervis.h"
#include "VoicesPage.h"
//ACP Virtual Voice
#include "sndvirt.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CVoicesPage property page
IMPLEMENT_DYNCREATE(CVoicesPage, CPropertyPage)
CVoicesPage::CVoicesPage() : CPropertyPage(CVoicesPage::IDD)
{
//{{AFX_DATA_INIT(CVoicesPage)
m_iMaxVoices = 0;
m_iUsedVoices = 0;
//}}AFX_DATA_INIT
}
CVoicesPage::~CVoicesPage()
{
}
void CVoicesPage::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CVoicesPage)
DDX_Control(pDX, IDC_VOICES_COMBO, m_VoicesCombo);
DDX_Control(pDX, IDC_VOICES_LIST, m_VoicesListCtrl);
DDX_Text(pDX, IDC_MAX_VOICES, m_iMaxVoices);
DDX_Text(pDX, IDC_USED_VOICES, m_iUsedVoices);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CVoicesPage, CPropertyPage)
//{{AFX_MSG_MAP(CVoicesPage)
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CVoicesPage message handlers
BOOL CVoicesPage::OnInitDialog()
{
CPropertyPage::OnInitDialog();
CSupervisApp* pSuperVisApp = (CSupervisApp*)AfxGetApp();
//Initialise the ClistCtrl containing virtual voices descriptions
LV_COLUMN* lvc;
lvc = (LV_COLUMN*)malloc(sizeof(LV_COLUMN));
lvc->mask = LVCF_FMT |LVCF_SUBITEM
| LVCF_TEXT | LVCF_WIDTH; // members contain valid information
lvc->fmt = LVCFMT_LEFT; // Alignment of the column
lvc->cx = pSuperVisApp->m_RegKeyVoicePage.iColVoiceId; // width of the column, in pixels
lvc->pszText = "Voices Id"; // column heading
lvc->iSubItem = 0; // index of subitem associated with column
m_VoicesListCtrl.InsertColumn(0, lvc);
lvc->pszText = "Paused?"; // column heading
lvc->cx = pSuperVisApp->m_RegKeyVoicePage.iColPaused; // width of the column, in pixels
lvc->iSubItem = 1; // index of subitem associated with column
m_VoicesListCtrl.InsertColumn(1, lvc);
lvc->pszText = "Res Ptr"; // column heading
lvc->cx = pSuperVisApp->m_RegKeyVoicePage.iColResPtr; // width of the column, in pixels
lvc->iSubItem = 2; // index of subitem associated with column
m_VoicesListCtrl.InsertColumn(2, lvc);
lvc->pszText = "Res Id"; // column heading
lvc->cx = pSuperVisApp->m_RegKeyVoicePage.iColResId; // width of the column, in pixels
lvc->iSubItem = 3; // index of subitem associated with column
m_VoicesListCtrl.InsertColumn(3, lvc);
lvc->pszText = "Loop"; // column heading
lvc->cx = pSuperVisApp->m_RegKeyVoicePage.iColLoop; // width of the column, in pixels
lvc->iSubItem = 4; // index of subitem associated with column
m_VoicesListCtrl.InsertColumn(4, lvc);
lvc->pszText = "Norm"; // column heading
lvc->cx = pSuperVisApp->m_RegKeyVoicePage.iColNorm; // width of the column, in pixels
lvc->iSubItem = 5; // index of subitem associated with column
m_VoicesListCtrl.InsertColumn(5, lvc);
lvc->pszText = "Instance"; // column heading
lvc->cx = pSuperVisApp->m_RegKeyVoicePage.iColInstance; // width of the column, in pixels
lvc->iSubItem = 6; // index of subitem associated with column
m_VoicesListCtrl.InsertColumn(6, lvc);
lvc->pszText = "Audible Voice"; // column heading
lvc->cx = pSuperVisApp->m_RegKeyVoicePage.iColAudibleV; // width of the column, in pixels
lvc->iSubItem = 7; // index of subitem associated with column
m_VoicesListCtrl.InsertColumn(7, lvc);
lvc->pszText = "Hard Voice"; // column heading
lvc->cx = pSuperVisApp->m_RegKeyVoicePage.iColHardV; // width of the column, in pixels
lvc->iSubItem = 8; // index of subitem associated with column
m_VoicesListCtrl.InsertColumn(8, lvc);
free( lvc );
//init module ComboBox so GetCurSel() wont return a CB_ERR
m_VoicesCombo.SetCurSel(0);
UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CVoicesPage::RefreshVoiceList()
{
int i;
CSupervisApp* pSuperVisApp = (CSupervisApp*)AfxGetApp();
//Get the module currently selected...
int iSelectedModule = m_VoicesCombo.GetCurSel();
//Clear the list
m_VoicesListCtrl.DeleteAllItems();
//Clear the comboBox
m_VoicesCombo.ResetContent();
//If there is nothing in the array we leave
int iNbModule = pSuperVisApp->m_apVirtualVoiceModule.GetSize();
if (iNbModule == 0)
return;
VirtualVoiceModule *pModule;
//Add module desciption in the ComboBox
for (i = 0; i < iNbModule; i++ )
{
pModule = (VirtualVoiceModule *)pSuperVisApp->m_apVirtualVoiceModule.GetAt(i);
m_VoicesCombo.AddString(pModule->cDescription);
}
//Set to the module currently
//No item is selected
if (iSelectedModule == CB_ERR)
iSelectedModule = 0;
//Set the combobox to the selected module
m_VoicesCombo.SetCurSel(iSelectedModule);
pModule = (VirtualVoiceModule *)pSuperVisApp->m_apVirtualVoiceModule.GetAt(iSelectedModule);
//Clean the virtual voices array
int iArraySize = pModule->apVirtualVoicesArray.GetSize();
VirtualVoice *pVoice;
for (i = 0; i < iArraySize; i ++ )
{
//Retrieve the current Voice
pVoice = (VirtualVoice *)(pModule->apVirtualVoicesArray.GetAt(i));
//Is the voice still active
if(!pVoice->bStillActive){
//Erase
pModule->apVirtualVoicesArray.RemoveAt(i);
delete pVoice;
i --;
iArraySize--;
}
}
//Cycle through the Current Virtual voices module.
iArraySize = pModule->apVirtualVoicesArray.GetSize();
for (i = 0; i < iArraySize; i ++ )
{
//We have to pass the index to the current module
AddVoiceToList(i, iSelectedModule);
}
//We display here the number of voices
SND_tdhVirtualModule pVirtualModule = (SND_tdhVirtualModule)pModule->lIdModule;
// m_iUsedVoices = SNDLST2_M_DynamicGetNumberOfElements(&pVirtualModule->virtual_voices.pList);
m_iUsedVoices = pModule->apVirtualVoicesArray.GetSize();
m_iMaxVoices = pVirtualModule->g_lNbSxdAudible;
UpdateData(FALSE);
}
void CVoicesPage::AddVoiceToList(long lVoiceIndex, long lModuleIndex)
{
CSupervisApp* pSuperVisApp = (CSupervisApp*)AfxGetApp();
//Retrieve the current module
VirtualVoiceModule *pModule;
pModule = (VirtualVoiceModule *)pSuperVisApp->m_apVirtualVoiceModule.GetAt(lModuleIndex);
//Retrieve the current Voice
VirtualVoice *pVoice;
pVoice = (VirtualVoice *)(pModule->apVirtualVoicesArray.GetAt(lVoiceIndex));
//Retrieve data from the control
PostMessage(WM_USER_UPDATE_DATA_TRUE, 0, 0);
char buffer[128];
//Display item, Voice Id
sprintf(buffer,"0x%08x", pVoice->lId);
m_VoicesListCtrl.InsertItem( 0, buffer );
//Set the item data with the Micro Array index, to be used later for drag&drop, pop-memnu, etc.
m_VoicesListCtrl.SetItemData( 0, (DWORD)lVoiceIndex );
//Paused?
if(pVoice->bPaused)
sprintf(buffer, "Yes");
else
sprintf(buffer, "No");
m_VoicesListCtrl.SetItem(0, 1, LVIF_TEXT, buffer, 0, 0, 0, NULL );
//Resource pointer
sprintf(buffer,"0x%08x", pVoice->lResRef);
m_VoicesListCtrl.SetItem(0, 2, LVIF_TEXT, buffer, 0, 0, 0, NULL );
//Resource ID
sprintf(buffer,"0x%08x", pVoice->lResId);
m_VoicesListCtrl.SetItem(0, 3, LVIF_TEXT, buffer, 0, 0, 0, NULL );
//loop?
if(pVoice->bLoop)
sprintf(buffer, "Yes");
else
sprintf(buffer, "No");
m_VoicesListCtrl.SetItem(0, 4, LVIF_TEXT, buffer, 0, 0, 0, NULL );
//Norm
sprintf(buffer, "%6.3f", pVoice->dNorme);
m_VoicesListCtrl.SetItem(0, 5, LVIF_TEXT, buffer, 0, 0, 0, NULL );
//Instance
sprintf(buffer, "%d", pVoice->lInstance);
m_VoicesListCtrl.SetItem(0, 6, LVIF_TEXT, buffer, 0, 0, 0, NULL );
if (pVoice->lAudible)
{
//Audible voice
sprintf(buffer, "0x%08x", pVoice->lAudible);
m_VoicesListCtrl.SetItem(0, 7, LVIF_TEXT, buffer, 0, 0, 0, NULL );
//Hard voice
sprintf(buffer, "0x%08x", pVoice->lVoice);
m_VoicesListCtrl.SetItem(0, 8, LVIF_TEXT, buffer, 0, 0, 0, NULL );
}
else
{
//Audible voice
sprintf(buffer, "");
m_VoicesListCtrl.SetItem(0, 7, LVIF_TEXT, buffer, 0, 0, 0, NULL );
//Hard voice
sprintf(buffer, "");
m_VoicesListCtrl.SetItem(0, 8, LVIF_TEXT, buffer, 0, 0, 0, NULL );
}
//Refresh data from the control
// PostMessage(WM_USER_UPDATE_DATA_FALSE, 0, 0);
}
BOOL CVoicesPage::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_USER_UPDATE_DATA_TRUE)
{
//We send the updatedata(TRUE) here
//We cannot pass the CWnd across thread and this cause problem while using updatedata
UpdateData(TRUE);
}
if(pMsg->message == WM_USER_UPDATE_DATA_FALSE)
{
//We send the updatedata(TRUE) here
//We cannot pass the CWnd across thread and this cause problem while using updatedata
UpdateData(FALSE);
}
return CPropertyPage::PreTranslateMessage(pMsg);
}
void CVoicesPage::OnDestroy()
{
CPropertyPage::OnDestroy();
CSupervisApp* pSuperVisApp = (CSupervisApp*)AfxGetApp();
int ColWidth = m_VoicesListCtrl.GetColumnWidth(0);
pSuperVisApp->m_RegKeyVoicePage.iColVoiceId = ColWidth;
ColWidth = m_VoicesListCtrl.GetColumnWidth(1);
pSuperVisApp->m_RegKeyVoicePage.iColPaused = ColWidth;
ColWidth = m_VoicesListCtrl.GetColumnWidth(2);
pSuperVisApp->m_RegKeyVoicePage.iColResPtr = ColWidth;
ColWidth = m_VoicesListCtrl.GetColumnWidth(3);
pSuperVisApp->m_RegKeyVoicePage.iColResId = ColWidth;
ColWidth = m_VoicesListCtrl.GetColumnWidth(4);
pSuperVisApp->m_RegKeyVoicePage.iColLoop= ColWidth;
ColWidth = m_VoicesListCtrl.GetColumnWidth(5);
pSuperVisApp->m_RegKeyVoicePage.iColNorm = ColWidth;
ColWidth = m_VoicesListCtrl.GetColumnWidth(6);
pSuperVisApp->m_RegKeyVoicePage.iColInstance = ColWidth;
ColWidth = m_VoicesListCtrl.GetColumnWidth(7);
pSuperVisApp->m_RegKeyVoicePage.iColAudibleV = ColWidth;
ColWidth = m_VoicesListCtrl.GetColumnWidth(8);
pSuperVisApp->m_RegKeyVoicePage.iColHardV = ColWidth;
}