SOUNDAPP.C
/************************************************************************** 
 * 
 *SOUNDAPP: 
 * 
 *A sample app showing the sndPlaySound API 
 * 
 ************************************************************************** 
 * 
 *  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY 
 *  KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE 
 *  IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR 
 *  PURPOSE. 
 * 
 *  Copyright 1994 - 1998 Microsoft Corporation.  All Rights Reserved. 
 * 
 **************************************************************************/ 
#pragma warning(disable: 4001) 
#define __SOUNDAPP_C 
#define Unused(var)(var=var) 
 
// header dependancies  
#include <windows.h> 
#include <mmsystem.h> 
#include <commdlg.h> 
#include <windowsx.h> 
#include "resource.h" 
 
//message cracker prototypes  
void SoundApp_OnActivate(HWND hwnd, UINT state, HWND hwndActDeact, BOOL fMinimized); 
void SoundApp_OnDestroy(HWND hwnd); 
void SoundApp_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify); 
BOOL About_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam); 
BOOL About_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify); 
 
//function prototypes  
long PASCAL WndProc (HWND, UINT, UINT, LONG); 
BOOL CALLBACK AboutDlgProc(HWND hdlg, UINT mMsg, WPARAM wParam, LPARAM lParam); 
LRESULT AboutDlgProc2(HWND hdlg, UINT mMsg,WPARAM wParam, LPARAM lParam); 
 
//global variables  
HANDLE hInst; 
BOOL bRecursing = FALSE; 
 
//////////////////////////////////////////////////////////////////////////////// 
//WinMain 
// 
//Purpose: The main procedure 
// 
//Parameters: HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam,  
//int nCmdShow 
// 
//Returns: int 
//////////////////////////////////////////////////////////////////////////////////  
int PASCAL WinMain ( 
HINSTANCE hInstance,  
HINSTANCE hPrevInstance, 
LPSTR lpszCmdParam,  
int nCmdShow) 
 
{ 
static char szAppName[] = "SoundApp"; 
HWND        hwnd; 
MSG         msg; 
WNDCLASS    wndclass; 
 
Unused(lpszCmdParam); 
 
if (!hPrevInstance) 
{ 
wndclass.style         = CS_HREDRAW | CS_VREDRAW; 
wndclass.lpfnWndProc   = WndProc; 
wndclass.cbClsExtra    = 0 ; 
wndclass.cbWndExtra    = DLGWINDOWEXTRA; 
wndclass.hInstance     = hInstance; 
wndclass.hIcon         = LoadIcon (hInstance, "IDI_SOUNDAPP"); 
wndclass.hCursor       = LoadCursor (NULL, IDI_APPLICATION); 
wndclass.hbrBackground = GetStockObject(WHITE_BRUSH); 
wndclass.lpszMenuName  = NULL; 
wndclass.lpszClassName = szAppName; 
 
RegisterClass (&wndclass); 
} 
 
hInst = hInstance; 
hwnd = CreateDialog(hInstance, "SoundApp", 0, NULL); 
CreateDialog(hInstance, "ID_SOUNDAPP_ABOUT", hwnd, NULL); 
ShowWindow (hwnd, nCmdShow); 
 
while (GetMessage (&msg, NULL, 0, 0)) 
{ 
TranslateMessage (&msg); 
DispatchMessage (&msg); 
} 
return msg.wParam; 
} 
 
///////////////////////////////////////////////////////////////////////// 
//WndProc 
// 
//Purpose: The window procedure 
// 
//Parameters: HWND hwnd, UINT message, UINT wParam, LONG lParam 
// 
//Returns: long 
///////////////////////////////////////////////////////////////////////////   
long PASCAL WndProc ( 
HWND hwnd,  
UINT message,  
UINT wParam,  
LONG lParam) 
 
{ 
switch (message) 
{ 
HANDLE_MSG(hwnd, WM_DESTROY, SoundApp_OnDestroy); 
HANDLE_MSG(hwnd, WM_ACTIVATE, SoundApp_OnActivate); 
HANDLE_MSG(hwnd, WM_COMMAND, SoundApp_OnCommand); 
default: 
return DefWindowProc (hwnd, message, wParam, lParam); 
} 
} 
 
////////////////////////////////////////////////////////////////////// 
//SoundApp_OnActivate 
// 
//Purpose: processes a WM_ACTIVATE message 
//Initializes controls in the dialog the first time it is activated: 
//Checks Synchronous, disables Loop and Stop, and gets default sound 
//from win.ini or registry.  
// 
//Parameters: HWND hwnd, UINT state, HWND hwndActDeact, BOOL fMinimized 
// 
//Returns: void 
////////////////////////////////////////////////////////////////////// 
void SoundApp_OnActivate( 
HWND hwnd, 
UINT state, 
HWND hwndActDeact, 
BOOL fMinimized) 
 
{ 
static BOOL fFirstTime = TRUE; 
HMENU hMenu; 
char SoundBuff[256]; 
int i=0; 
 
if (fFirstTime) 
{ 
hMenu = GetMenu(hwnd); 
SendMessage(GetDlgItem(hwnd, IDC_SYNC), BM_SETCHECK, 1, 0); 
CheckMenuItem(hMenu, ID_OPTIONS_SYNC,MF_CHECKED); 
EnableWindow(GetDlgItem(hwnd, IDC_LOOP), FALSE); 
EnableMenuItem(hMenu, ID_OPTIONS_LOOP, MF_DISABLED | MF_GRAYED); 
EnableWindow(GetDlgItem(hwnd, IDC_BUTTON_STOP), FALSE); 
GetProfileString("Sounds", "SystemDefault", ",Default", SoundBuff, 256); 
//get rid of everything after the filename 
while(SoundBuff[i] != ',' && i<255) 
{ 
i++; 
} 
SoundBuff[i] = 0; 
SendMessage(GetDlgItem(hwnd, IDC_EDIT_FILE), WM_SETTEXT, 0, (LPARAM)SoundBuff); 
fFirstTime = FALSE; 
}  
} 
 
 
////////////////////////////////////////////////////////////////////// 
//SoundApp_OnDestroy 
// 
//Purpose: processes a WM_DESTROY message 
// 
//Parameters: handle to the main window 
// 
//Returns: void   
////////////////////////////////////////////////////////////////////// 
void SoundApp_OnDestroy(HWND hwnd) 
{ 
PostQuitMessage (0); 
} 
 
 
/////////////////////////////////////////////////////////////////////// 
//SoundApp_OnCommand 
// 
//Purpose: processes a WM_COMMAND message 
//details below for each command. 
// 
//Parameters: HWND hwnd, int id, HWND hwndCtl, UINT codeNotify 
// 
//Returns: void   
/////////////////////////////////////////////////////////////////////// 
void SoundApp_OnCommand( 
HWND hwnd, 
int id, 
HWND hwndCtl, 
UINT codeNotify) 
 
{ 
static LPCTSTR lpszSoundName = NULL;//name of the sound to play 
static UINT uFlags = SND_SYNC;//option flags for sndPlaySound 
HWND hButton; 
HMENU hMenu; 
LRESULT nCheckState; 
char SoundBuff[256]; 
static fFirstTime = TRUE; 
 
OPENFILENAME ofn;       // common dialog box structure  
char szDirName[256];    // directory string  
staticchar szFile[256];       // filename string  
char szFileTitle[256];  // file-title string  
char szFilter[256];     // filter string  
char chReplace;         // string separator for szFilter  
int i, cbString;        // integer count variables  
char szSelectFile[256];// title of select file dialog  
 
//first get default sound name from win.ini or registry  
if (fFirstTime) 
{ 
GetProfileString("Sounds", "SystemDefault", ",Default", SoundBuff, 256); 
//get rid of everything after the filename in the ini string 
i=0; 
while(SoundBuff[i] != ',' && i<255) 
{ 
i++; 
} 
SoundBuff[i] = 0; 
if (i == 0) 
{ 
lpszSoundName = NULL; 
} 
else 
{ 
lpszSoundName = SoundBuff; 
}  
fFirstTime = FALSE; 
} 
hMenu = GetMenu(hwnd); 
 
//if File|Exit is selected, quit 
if(id == ID_FILE_EXIT) 
{ 
PostQuitMessage (0); 
} 
 
//if Play button is clicked, play sound 
if(id == IDC_BUTTON_PLAY) 
{    
sndPlaySound(lpszSoundName, uFlags); 
} 
 
//if Stop button is pushed, stop playing sound 
if(id == IDC_BUTTON_STOP) 
{ 
sndPlaySound(NULL, SND_SYNC); 
} 
 
//if File|Select File or the Select File button is selected, show the 
//file open dialog and get the name of the file to play 
if(id == ID_FILE_SELECT || id == IDC_BUTTON_OPEN) 
{ 
//Set up structure for file dialog 
GetWindowsDirectory(szDirName, sizeof(szDirName)); 
szFile[0] = '\0'; 
LoadString(NULL, IDS_SELECT_FILE, szSelectFile, sizeof(szSelectFile)); 
cbString = LoadString(NULL, IDS_FILTERSTRING, szFilter, sizeof(szFilter)); 
chReplace = szFilter[cbString - 1]; 
for (i = 0; szFilter[i] != '\0'; i++) 
{ 
if (szFilter[i] == chReplace) 
szFilter[i] = '\0'; 
} 
 
ofn.lStructSize = sizeof(OPENFILENAME); 
ofn.hwndOwner = hwnd; 
ofn.lpstrFilter = szFilter; 
ofn.lpstrCustomFilter = NULL; 
ofn.nFilterIndex = 1; 
ofn.lpstrFile = szFile; 
ofn.nMaxFile = sizeof(szFile); 
ofn.lpstrFileTitle = szFileTitle; 
ofn.nMaxFileTitle = sizeof(szFileTitle); 
ofn.lpstrInitialDir = szDirName; 
ofn.lpstrTitle = szSelectFile; 
ofn.lpstrDefExt = NULL; 
ofn.Flags = OFN_SHAREAWARE | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; 
 
//Put up Open File dialog to get filename   
if (GetOpenFileName(&ofn))  
{ 
lpszSoundName = ofn.lpstrFile; 
hButton = GetDlgItem(hwnd, IDC_EDIT_FILE); 
SendMessage(hButton, WM_SETTEXT, 0, (LPARAM)ofn.lpstrFileTitle); 
}    
} 
 
//if Help|About is selected, show the About SoundApp dialog 
if(id == ID_HELP_ABOUT) 
{ 
FARPROC lpfnAbout; 
 
lpfnAbout = MakeProcInstance((FARPROC)AboutDlgProc, hInst); 
DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG_ABOUT), hwnd, (DLGPROC)lpfnAbout); 
FreeProcInstance(lpfnAbout); 
} 
 
//if Options|Sync or the Sync button is selected, set checks and flags 
if(id == IDC_SYNC || id == ID_OPTIONS_SYNC) 
{ 
hButton = GetDlgItem(hwnd, IDC_SYNC); 
nCheckState = SendMessage(hButton, BM_GETCHECK, 0, 0); 
//if Synchronous ws unchecked 
if (nCheckState == 0) 
{ 
//check Synchronous checkbox, uncheck Asynchronous checkbox, 
//check Synchronous menu, uncheck Asynchronous menu, 
//uncheck Loop checkbox and menu, 
//disable Loop checkbox and menu, 
//disable Stop button, and set sndPlaySound flags.  
SendMessage(hButton, BM_SETCHECK, 1, 0);    
SendMessage(GetDlgItem(hwnd, IDC_ASYNC),BM_SETCHECK, 0, 0); 
CheckMenuItem(hMenu, ID_OPTIONS_SYNC,MF_CHECKED);    
CheckMenuItem(hMenu, ID_OPTIONS_ASYNC, MF_UNCHECKED);  
SendMessage(GetDlgItem(hwnd, IDC_LOOP), BM_SETCHECK, 0, 0); 
CheckMenuItem(hMenu, ID_OPTIONS_LOOP,MF_UNCHECKED);    
EnableWindow(GetDlgItem(hwnd, IDC_LOOP), FALSE); 
EnableMenuItem(hMenu, ID_OPTIONS_LOOP, MF_DISABLED | MF_GRAYED); 
EnableWindow(GetDlgItem(hwnd, IDC_BUTTON_STOP), FALSE); 
uFlags = uFlags & ~SND_ASYNC & ~SND_LOOP; 
} 
} 
 
//if Options|Async or the Async button is selected, set checks and flags 
if(id == IDC_ASYNC || id == ID_OPTIONS_ASYNC) 
{ 
hButton = GetDlgItem(hwnd, IDC_ASYNC); 
nCheckState = SendMessage(hButton, BM_GETCHECK, 0, 0); 
//if Asynchronous was unchecked 
if (nCheckState == 0) 
{ 
//check Asynchronous checkbox, uncheck Synchronous checkbox, 
//check Asynchronous menu, uncheck Synchronous menu, 
//enable Loop checkbox and menu, 
//enable Stop button, and set sndPlaySound flags.  
SendMessage(hButton, BM_SETCHECK, 1, 0); 
SendMessage(GetDlgItem(hwnd, IDC_SYNC),BM_SETCHECK, 0, 0); 
CheckMenuItem(hMenu, ID_OPTIONS_ASYNC,MF_CHECKED);  
CheckMenuItem(hMenu, ID_OPTIONS_SYNC, MF_UNCHECKED);  
EnableWindow(GetDlgItem(hwnd, IDC_LOOP), TRUE); 
EnableMenuItem(hMenu, ID_OPTIONS_LOOP, MF_ENABLED);  
EnableWindow(GetDlgItem(hwnd, IDC_BUTTON_STOP), TRUE); 
uFlags = uFlags | SND_ASYNC; 
} 
} 
 
//if Options|NoDefault or the NoDefault button is selected, set checks and flags 
if(id == ID_OPTIONS_NODEFAULT || id == IDC_NODEFAULT) 
{  
hButton = GetDlgItem(hwnd, IDC_NODEFAULT); 
nCheckState = SendMessage(hButton, BM_GETCHECK, 0, 0); 
//if NoDefault was unchecked 
if (nCheckState == 0) 
{ 
//check NoDefault checkbox and menu, and set sndPlaySound flags.  
SendMessage(hButton, BM_SETCHECK, 1, 0); 
CheckMenuItem(hMenu, ID_OPTIONS_NODEFAULT, MF_CHECKED);  
uFlags = uFlags | SND_NODEFAULT; 
} 
else 
{ 
//uncheck NoDefault checkbox and menu, and set sndPlaySound flags.  
SendMessage(hButton, BM_SETCHECK, 0, 0); 
CheckMenuItem(hMenu, ID_OPTIONS_NODEFAULT, MF_UNCHECKED);  
uFlags = uFlags& ~SND_NODEFAULT; 
} 
} 
 
//if Options|Loop or the Loop button is selected, set checks and flags 
if(id == ID_OPTIONS_LOOP ||id == IDC_LOOP) 
{ 
hButton = GetDlgItem(hwnd, IDC_LOOP); 
nCheckState = SendMessage(hButton, BM_GETCHECK, 0, 0); 
//if Loop was unchecked 
if (nCheckState == 0) 
{ 
//check Loop checkbox and menu, and set sndPlaySound flags. 
SendMessage(hButton, BM_SETCHECK, 1, 0); 
CheckMenuItem(hMenu, ID_OPTIONS_LOOP,MF_CHECKED);    
uFlags = uFlags | SND_LOOP; 
} 
else 
{ 
//uncheck Loop checkbox and menu, and set sndPlaySound flags.  
SendMessage(hButton, BM_SETCHECK, 0, 0); 
CheckMenuItem(hMenu, ID_OPTIONS_LOOP,MF_UNCHECKED);   
uFlags = uFlags& ~SND_LOOP; 
} 
} 
 
//if Options|NoStop or the NoStop button is selected, set checks and flags 
if(id == ID_OPTIONS_NOSTOP || id == IDC_NOSTOP) 
{ 
hButton = GetDlgItem(hwnd, IDC_NOSTOP); 
nCheckState = SendMessage(hButton, BM_GETCHECK, 0, 0); 
//if NoStop was unchecked 
if (nCheckState == 0) 
{ 
//check NoStop checkbox and menu, and set sndPlaySound flags.  
SendMessage(hButton, BM_SETCHECK, 1, 0); 
CheckMenuItem(hMenu, ID_OPTIONS_NOSTOP,MF_CHECKED);    
uFlags = uFlags | SND_NOSTOP; 
} 
else 
{ 
//uncheck NoStop checkbox and menu, and set sndPlaySound flags. 
SendMessage(hButton, BM_SETCHECK, 0, 0); 
CheckMenuItem(hMenu, ID_OPTIONS_NOSTOP,MF_UNCHECKED);   
uFlags = uFlags& ~SND_NOSTOP; 
} 
} 
}    
   
///////////////////////////////////////////////////////////////////////////// 
//AboutDlgProc 
// 
//Purpose: Calls AboutDlgProc2 
//This makes it possible to use messge crackers in the dialog procedure 
// 
//Parameters:HWND hdlg, UINT mMsg, WPARAM wParam, LPARAM lParam 
// 
//Returns: BOOL 
/////////////////////////////////////////////////////////////////////////////// 
BOOL CALLBACK AboutDlgProc( 
HWND hdlg, 
UINT mMsg, 
WPARAM wParam, 
LPARAM lParam) 
 
{ 
CheckDefDlgRecursion(&bRecursing); 
return(SetDlgMsgResult(hdlg, mMsg, AboutDlgProc2(hdlg, mMsg, wParam, lParam))); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
//AboutDlgProc2 
// 
//Purpose: handle messages to the About dialog 
// 
//Parameters: HWND hdlg, UINT mMsg, WPARAM wParam, LPARAM lParam 
// 
//Returns: LRESULT 
/////////////////////////////////////////////////////////////////////////////// 
LRESULT AboutDlgProc2( 
HWND hdlg, 
UINT mMsg, 
WPARAM wParam, 
LPARAM lParam) 
 
    { 
switch(mMsg) 
{ 
HANDLE_MSG(hdlg, WM_INITDIALOG, About_OnInitDialog); 
HANDLE_MSG(hdlg, WM_COMMAND, About_OnCommand); 
default: 
return(DefDlgProcEx(hdlg, mMsg, wParam, lParam, &bRecursing)); 
} 
} 
 
///////////////////////////////////////////////////////////////////////// 
//About_OnInitDialog 
// 
//Purpose: Initialize About dialog. Set focus to the OK button. 
// 
//Parameters: HWND hdlg, HWND hwndFocus, LPARAM lParam 
// 
//Returns: TRUE 
////////////////////////////////////////////////////////////////////// 
BOOL About_OnInitDialog(HWND hdlg, HWND hwndFocus, LPARAM lParam) 
{ 
SetFocus(GetDlgItem(hdlg, IDOK)); 
return TRUE; 
} 
 
///////////////////////////////////////////////////////////////////////// 
//About_OnCommand 
// 
//Purpose: Closes the About dialog when the OK button is clicked 
// 
//Parameters: HWND hdlg, int id, HWND hwndCtl, UINT codeNotify 
// 
//Returns: BOOL 
////////////////////////////////////////////////////////////////////// 
BOOL About_OnCommand(HWND hdlg, int id, HWND hwndCtl, UINT codeNotify) 
{ 
if(id == IDOK) 
{ 
EndDialog(hdlg, TRUE); 
return TRUE; 
} 
return FALSE; 
}