?? musictool.cpp
字號:
//-----------------------------------------------------------------------------
// 文件名: MusicTool.cpp
//
// 描 述: 使用DirectMusic,播放主片段
//-----------------------------------------------------------------------------
#define STRICT
#include <windows.h>
#include <basetsd.h>
#include <commdlg.h>
#include <commctrl.h>
#include <dmusicc.h>
#include <dmusici.h>
#include <dmusicf.h>
#include <dxerr9.h>
#include <cguid.h>
#include <tchar.h>
#include <stdio.h>
#include "resource.h"
#include "DMUtil.h"
#include "DXUtil.h"
#include "EchoTool.h"
#include "MeasTool.h"
INT_PTR CALLBACK MainDlgProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam );
HRESULT OnInitDialog( HWND hDlg );
HRESULT ProcessDirectMusicMessages( HWND hDlg );
VOID OnOpenSoundFile( HWND hDlg );
HRESULT LoadSegmentFile( HWND hDlg, TCHAR* strFileName );
HRESULT OnPlaySegment( HWND hDlg );
VOID EnablePlayUI( HWND hDlg, BOOL bEnable );
HRESULT OnChangeTool( HWND hDlg );
HINSTANCE g_hInst = NULL;
CMusicManager* g_pMusicManager = NULL;
CMusicSegment* g_pMusicSegment = NULL;
CEchoTool* g_pEchoTool = NULL;
CMeasureTool* g_pMeasureTool1 = NULL;
CMeasureTool* g_pMeasureTool2 = NULL;
IDirectMusicTool* g_pCurrentTool = NULL;
IDirectMusicGraph* g_pGraph = NULL;
HANDLE g_hDMusicMessageEvent = NULL;
//-----------------------------------------------------------------------------
// 函數(shù)名: WinMain()
// 描 述: 應用程序的入口。使用簡單的對話框與用戶交互
//-----------------------------------------------------------------------------
INT APIENTRY WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine,
INT nCmdShow )
{
HWND hDlg = NULL;
BOOL bDone = FALSE;
int nExitCode = 0;
HRESULT hr;
DWORD dwResult;
MSG msg;
g_hInst = hInst;
// 顯示主對話框。
hDlg = CreateDialog( hInst, MAKEINTRESOURCE(IDD_MAIN),
NULL, MainDlgProc );
while( !bDone )
{
dwResult = MsgWaitForMultipleObjects( 1, &g_hDMusicMessageEvent,
FALSE, INFINITE, QS_ALLEVENTS );
switch( dwResult )
{
case WAIT_OBJECT_0 + 0:
// 發(fā)信號給g_hDPMessageEvent,因此有可用的messages消息。
if( FAILED( hr = ProcessDirectMusicMessages( hDlg ) ) )
{
DXTRACE_ERR_MSGBOX( TEXT("ProcessDirectMusicMessages"), hr );
return FALSE;
}
break;
case WAIT_OBJECT_0 + 1:
// Windows消息可用。
while( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
{
if( !IsDialogMessage( hDlg, &msg ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
if( msg.message == WM_QUIT )
{
nExitCode = (int)msg.wParam;
bDone = TRUE;
DestroyWindow( hDlg );
}
}
break;
}
}
return nExitCode;
}
//-----------------------------------------------------------------------------
// 函數(shù)名: MainDlgProc()
// 描 述: 處理對話框消息
//-----------------------------------------------------------------------------
INT_PTR CALLBACK MainDlgProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam )
{
HRESULT hr;
switch( msg )
{
case WM_INITDIALOG:
if( FAILED( hr = OnInitDialog( hDlg ) ) )
{
DXTRACE_ERR_MSGBOX( TEXT("OnInitDialog"), hr );
MessageBox( hDlg, "Error initializing DirectMusic. Sample will now exit.",
"DirectMusic Sample", MB_OK | MB_ICONERROR );
PostQuitMessage( IDABORT );
return FALSE;
}
break;
case WM_COMMAND:
switch( LOWORD(wParam) )
{
case IDC_SOUNDFILE:
OnOpenSoundFile( hDlg );
break;
case IDCANCEL:
PostQuitMessage( IDCANCEL );
break;
case IDC_PLAY:
if( FAILED( hr = OnPlaySegment( hDlg ) ) )
{
DXTRACE_ERR_MSGBOX( TEXT("OnPlaySegment"), hr );
MessageBox( hDlg, "Error playing DirectMusic segment. "
"Sample will now exit.", "DirectMusic Sample",
MB_OK | MB_ICONERROR );
PostQuitMessage( IDABORT );
}
break;
case IDC_STOP:
// 播放片段時,簡單調用Stop()不會停止任何MIDI sustain pedals,
// 但調用StopAll()可以。
if( g_pMusicManager )
g_pMusicManager->StopAll();
EnablePlayUI( hDlg, TRUE );
break;
case IDC_TOOL_COMBO:
OnChangeTool( hDlg );
break;
case IDHELP:
DXUtil_LaunchReadme( hDlg );
break;
default:
// 不處理消息
return FALSE;
}
break;
case WM_DESTROY:
// 清除一切
SAFE_RELEASE( g_pGraph );
SAFE_DELETE( g_pMusicSegment );
SAFE_DELETE( g_pMusicManager );
SAFE_DELETE( g_pEchoTool );
SAFE_DELETE( g_pMeasureTool1 );
SAFE_DELETE( g_pMeasureTool2 );
CloseHandle( g_hDMusicMessageEvent );
break;
default:
// 不處理消息
return FALSE;
}
return TRUE;
}
//-----------------------------------------------------------------------------
// 函數(shù)名: OnInitDialog()
// 描 述: 初始化對話框(建立UI控制等)
//-----------------------------------------------------------------------------
HRESULT OnInitDialog( HWND hDlg )
{
HRESULT hr;
LONG lIndex;
// 為對話框設置icon
HICON hIcon = LoadIcon( g_hInst, MAKEINTRESOURCE( IDR_MAINFRAME ) );
SendMessage( hDlg, WM_SETICON, ICON_BIG, (LPARAM) hIcon ); // 設置大icon
SendMessage( hDlg, WM_SETICON, ICON_SMALL, (LPARAM) hIcon ); // 設置小icon
g_hDMusicMessageEvent = CreateEvent( NULL, FALSE, FALSE, NULL );
g_pMusicManager = new CMusicManager();
if( NULL == g_pMusicManager )
return E_OUTOFMEMORY;
// 使用缺省音軌初始化DirectMusic
hr = g_pMusicManager->Initialize( hDlg );
if( FAILED(hr) )
return DXTRACE_ERR_MSGBOX( TEXT("Initialize"), hr );
IDirectMusicPerformance8* pPerformance = g_pMusicManager->GetPerformance();
IDirectMusicAudioPath8* pDefaultAudioPath = g_pMusicManager->GetDefaultAudioPath();
// 產(chǎn)生一個DirectMusicGraph,并告知相關的參數(shù)
hr = pDefaultAudioPath->GetObjectInPath( 0, DMUS_PATH_PERFORMANCE_GRAPH, 0,
GUID_NULL, 0, IID_IDirectMusicGraph,
(LPVOID*) &g_pGraph );
SAFE_RELEASE( pDefaultAudioPath );
if( FAILED( hr ) )
return DXTRACE_ERR_MSGBOX( TEXT("GetObjectInPath"), hr );
// 注冊片段通知
if( FAILED( hr = pPerformance->AddNotificationType( GUID_NOTIFICATION_SEGMENT ) ) )
return DXTRACE_ERR_MSGBOX( TEXT("AddNotificationType"), hr );
if( FAILED( hr = pPerformance->AddNotificationType( GUID_NOTIFICATION_MEASUREANDBEAT) ) )
return DXTRACE_ERR_MSGBOX( TEXT("AddNotificationType"), hr );
if( FAILED( hr = pPerformance->SetNotificationHandle( g_hDMusicMessageEvent, 0 ) ) )
return DXTRACE_ERR_MSGBOX( TEXT("SetNotificationHandle"), hr );
g_pEchoTool = new CEchoTool();
if( NULL == g_pEchoTool )
return E_OUTOFMEMORY;
g_pMeasureTool1 = new CMeasureTool(hDlg);
if( NULL == g_pMeasureTool1 )
return E_OUTOFMEMORY;
g_pMeasureTool2 = new CMeasureTool(hDlg);
if( NULL == g_pMeasureTool2 )
return E_OUTOFMEMORY;
// 初始化UI
HWND hToolCombo = GetDlgItem( hDlg, IDC_TOOL_COMBO );
lIndex = (LONG)SendMessage( hToolCombo, CB_ADDSTRING, 0, (LPARAM) TEXT("無") );
SendMessage( hToolCombo, CB_SETITEMDATA, lIndex, (LPARAM) NULL );
lIndex = (LONG)SendMessage( hToolCombo, CB_ADDSTRING, 0, (LPARAM) TEXT("Echo工具") );
SendMessage( hToolCombo, CB_SETITEMDATA, lIndex, (LPARAM) (IDirectMusicTool*) g_pEchoTool );
lIndex = (LONG)SendMessage( hToolCombo, CB_ADDSTRING, 0, (LPARAM) TEXT("Measure工具") );
SendMessage( hToolCombo, CB_SETITEMDATA, lIndex, (LPARAM) (IDirectMusicTool*) g_pMeasureTool1 );
SendMessage( hToolCombo, CB_SETCURSEL, 0, 0 );
// 裝載缺省的音頻片段
TCHAR strFileName[MAX_PATH+1];
DXUtil_GetDXSDKMediaPathCb( strFileName, sizeof(strFileName) );
strcat( strFileName, "sample.sgt" );
if( S_FALSE == LoadSegmentFile( hDlg, strFileName ) )
{
// 設置UI控制
SetDlgItemText( hDlg, IDC_FILENAME, TEXT("No file loaded.") );
}
else
{
IDirectMusicSegment8* pPrimarySegment8;
DMUS_TEMPO_PARAM tempo;
MUSIC_TIME mtTime = 0;
pPrimarySegment8 = g_pMusicSegment->GetSegment();
tempo.mtTime = 0;
tempo.dblTempo = 70.;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -