mirror of https://github.com/tongzx/nt5src
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
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
|
|
}
|