Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

234 lines
5.9 KiB

/*
sound.c
Sound menu stuff
Puts up a list of all the sounds in the [sounds]
section of win.ini and plays the selected one
*/
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <commdlg.h>
#include "PlaySnd.h"
#define KEYBUFSIZE 2048
LONG SoundDlgProc(HWND hDlg, UINT msg, DWORD wParam, LONG lParam);
typedef struct SoundNameAlias {
LPSTR pName;
UINT alias;
} SOUNDNAMEALIAS;
static SOUNDNAMEALIAS sss[] = {"System"};
static SOUNDNAMEALIAS SNA[] = {
"SystemAsterisk", sndAlias('S', '*') ,
"SystemQuestion", sndAlias('S', '?') ,
"SystemHand", sndAlias('S', 'H') ,
"SystemExit", sndAlias('S', 'E') ,
"SystemStartup", sndAlias('S', 'S') ,
"SystemWelcome", sndAlias('S', 'W') ,
"SystemExclamation", sndAlias('S', '!') ,
"SystemDefault", sndAlias('S', 'D') };
#define NUMSYSTEMSOUNDS (sizeof(SNA)/sizeof(SOUNDNAMEALIAS))
UINT TranslateNameToAlias(LPSTR name)
{
UINT n;
for (n=0; n<NUMSYSTEMSOUNDS; ++n) {
if (!lstrcmpi(name, SNA[n].pName)) {
return(SNA[n].alias);
}
}
return(0);
}
void Sounds(HWND hWnd)
{
WinEval(DialogBox(ghModule, MAKEINTRESOURCE(IDD_SOUNDDLG) // "SoundDlg"
, hWnd, (DLGPROC)SoundDlgProc) != -1);
}
void PlaySelection(HWND hDlg)
{
DWORD dwSel;
DWORD dwFlags = SND_ASYNC | bNoDefault | SND_NOSTOP;
char name[40];
UINT alias;
LPSTR pName = name;
BOOL fSync;
BOOL fWait;
dwSel = SendDlgItemMessage(hDlg, IDSND_LIST, LB_GETCURSEL, 0, 0);
if (dwSel != LB_ERR) {
SendDlgItemMessage(hDlg, IDSND_LIST,
LB_GETTEXT,
(WPARAM)dwSel,
(LPARAM)name);
dwFlags = SND_ALIAS;
fSync = (BOOL)SendDlgItemMessage(hDlg, IDSND_SYNC, BM_GETCHECK, 0, 0);
if (fSync) {
// Turn off ASYNC
dwFlags &= ~SND_ASYNC;
} else {
dwFlags |= SND_ASYNC;
}
fWait = (BOOL)SendDlgItemMessage(hDlg, IDSND_WAIT, BM_GETCHECK, 0, 0);
if (!fWait) dwFlags |= SND_NOWAIT;
if (1 == SendDlgItemMessage(hDlg, IDSND_IDPLAY, BM_GETCHECK, 0, 0)) {
if (0 != (alias = TranslateNameToAlias(name))) {
dwFlags |= SND_ALIAS_ID;
pName = (LPSTR)alias;
}
}
if (!PlaySound(pName, NULL, dwFlags | bNoDefault)) {
Error("Failed to play alias: %s", name);
}
}
}
VOID SetSoundName(HWND hDlg)
{
DWORD dwSel;
char name[40];
char filename[MAX_PATH];
UINT n;
dwSel = SendDlgItemMessage(hDlg, IDSND_LIST, LB_GETCURSEL, 0, 0);
if (dwSel != LB_ERR
&& SendDlgItemMessage(hDlg, IDSND_LIST,
LB_GETTEXT,
(WPARAM)dwSel,
(LPARAM)name)
&& (n=GetProfileString("SOUNDS", name, NULL, filename, sizeof(filename)))
) {
do {
n--;
if (filename[n] == ',') {
filename[n]=0;
}
} while (filename[n]);
GetFileTitle(filename, name, sizeof(name));
SendDlgItemMessage(hDlg, IDSND_SOUNDNAME, WM_SETTEXT, 0, (LPARAM)name);
} else {
SendDlgItemMessage(hDlg, IDSND_SOUNDNAME, WM_SETTEXT, 0, (LPARAM)"<no selection>");
}
}
LONG SoundDlgProc(HWND hDlg, UINT msg, DWORD wParam, LONG lParam)
{
LPSTR lpBuf, lpKey;
DWORD dwChars;
// dprintf4(("SoundDlgProc: %8.8XH, %8.8XH, %8.8XH", msg, wParam, lParam));
switch (msg) {
case WM_INITDIALOG:
// fill the listbox with the keys in the [sounds]
// section of win.ini
// allocate a buffer to put the keys in
WinEval(lpBuf = (LPSTR) GlobalAlloc(GMEM_FIXED|GMEM_ZEROINIT, KEYBUFSIZE));
// get the key list
dwChars = GetProfileString("sounds", NULL, "", lpBuf, KEYBUFSIZE);
dprintf4(("%lu chars read from [sounds] section", dwChars));
if (dwChars > 0) {
// add each entry to the list box
lpKey = lpBuf;
while (*lpKey) {
// TEMPORARY SECTION
if (lstrcmpi((LPCTSTR)lpKey, "enable")) // if not ENABLE
// END OF TEMPORARY SECTION
SendMessage(GetDlgItem(hDlg, IDSND_LIST),
LB_ADDSTRING,
0,
(LONG)lpKey);
lpKey += strlen(lpKey) + 1;
}
} else {
// show there aren't any
SendMessage(GetDlgItem(hDlg, IDSND_LIST),
LB_ADDSTRING,
0,
(LONG)(LPSTR)"[none]");
}
SendDlgItemMessage(hDlg, IDSND_SOUNDNAME, WM_SETTEXT, 0, (LPARAM)"");
if (bSync) {
// Set the initial state of the Sync checkbox from global flag
SendDlgItemMessage(hDlg, IDSND_SYNC, BM_SETCHECK, 1, 0);
}
if (!bNoWait) {
// Set the initial state of the Wait checkbox from global flag
SendDlgItemMessage(hDlg, IDSND_WAIT, BM_SETCHECK, 1, 0);
}
GlobalFree((HANDLE)lpBuf);
// disable the play button till we get a selection
EnableWindow(GetDlgItem(hDlg, IDSND_PLAY), FALSE);
break;
case WM_COMMAND:
dprintf4(("WM_COMMAND: %08lXH, %08lX", wParam, lParam));
switch (LOWORD(wParam)) {
case IDOK:
EndDialog(hDlg, TRUE);
break;
case IDSND_PLAY:
// get the current selection and try to play it
PlaySelection(hDlg);
break;
case IDSND_LIST:
switch (HIWORD(wParam)){
case LBN_SELCHANGE:
// enable the play button
EnableWindow(GetDlgItem(hDlg, IDSND_PLAY), TRUE);
dprintf3(("Play button enabled"));
// Set the current sound name
SetSoundName(hDlg);
break;
case LBN_DBLCLK:
PlaySelection(hDlg);
break;
default:
break;
}
break;
default:
break;
}
break;
default:
return FALSE; // say we didn't handle it
break;
}
return TRUE; // say we handled it
}