186 lines
6 KiB
C
186 lines
6 KiB
C
|
/*
|
||
|
BASS multi-speaker example
|
||
|
Copyright (c) 2003-2014 Un4seen Developments Ltd.
|
||
|
*/
|
||
|
|
||
|
#include <windows.h>
|
||
|
#include <stdio.h>
|
||
|
#include "bass.h"
|
||
|
|
||
|
HWND win = NULL;
|
||
|
|
||
|
DWORD flags[4] = { BASS_SPEAKER_FRONT,BASS_SPEAKER_REAR,BASS_SPEAKER_CENLFE,BASS_SPEAKER_REAR2 };
|
||
|
HSTREAM chan[4];
|
||
|
|
||
|
// display error messages
|
||
|
void Error(const char *es)
|
||
|
{
|
||
|
char mes[200];
|
||
|
sprintf(mes, "%s\n(error code: %d)", es, BASS_ErrorGetCode());
|
||
|
MessageBox(win, mes, 0, 0);
|
||
|
}
|
||
|
|
||
|
#define MESS(id,m,w,l) SendDlgItemMessage(win,id,m,(WPARAM)(w),(LPARAM)(l))
|
||
|
#define ITEM(id) GetDlgItem(win,id)
|
||
|
|
||
|
void UpdateSpeakerFlags(DWORD speaker)
|
||
|
{
|
||
|
int mono = MESS(30 + speaker * 2, BM_GETCHECK, 0, 0) | (MESS(30 + speaker * 2 + 1, BM_GETCHECK, 0, 0) << 1); // get mono switch states
|
||
|
BASS_ChannelFlags(chan[speaker], flags[speaker] | (mono == 1 ? BASS_SPEAKER_LEFT : mono == 2 ? BASS_SPEAKER_RIGHT : 0), BASS_SPEAKER_FRONT); // update speaker flags
|
||
|
}
|
||
|
|
||
|
BOOL CALLBACK dialogproc(HWND h, UINT m, WPARAM w, LPARAM l)
|
||
|
{
|
||
|
static OPENFILENAME ofn;
|
||
|
|
||
|
switch (m) {
|
||
|
case WM_COMMAND:
|
||
|
switch (LOWORD(w)) {
|
||
|
case IDCANCEL:
|
||
|
EndDialog(h, 0);
|
||
|
return 1;
|
||
|
case 10: // open a file to play on #1
|
||
|
case 11: // open a file to play on #2
|
||
|
case 12: // open a file to play on #3
|
||
|
case 13: // open a file to play on #4
|
||
|
{
|
||
|
int speaker = LOWORD(w) - 10;
|
||
|
char file[MAX_PATH] = "";
|
||
|
ofn.lpstrFile = file;
|
||
|
if (GetOpenFileName(&ofn)) {
|
||
|
BASS_StreamFree(chan[speaker]); // free old stream before opening new
|
||
|
if (!(chan[speaker] = BASS_StreamCreateFile(FALSE, file, 0, 0, flags[speaker] | BASS_SAMPLE_LOOP))) {
|
||
|
MESS(10 + speaker, WM_SETTEXT, 0, "click here to open a file...");
|
||
|
Error("Can't play the file");
|
||
|
return 1;
|
||
|
}
|
||
|
MESS(10 + speaker, WM_SETTEXT, 0, file);
|
||
|
{ // reset mono speaker switches
|
||
|
BASS_CHANNELINFO ci;
|
||
|
BASS_ChannelGetInfo(chan[speaker], &ci);
|
||
|
MESS(30 + speaker * 2, BM_SETCHECK, 0, 0);
|
||
|
MESS(30 + speaker * 2 + 1, BM_SETCHECK, 0, 0);
|
||
|
EnableWindow(ITEM(30 + speaker * 2), ci.chans == 1);
|
||
|
EnableWindow(ITEM(30 + speaker * 2 + 1), ci.chans == 1);
|
||
|
}
|
||
|
BASS_ChannelPlay(chan[speaker], FALSE);
|
||
|
}
|
||
|
}
|
||
|
return 1;
|
||
|
case 20: // swap #1 & #2
|
||
|
case 21: // swap #2 & #3
|
||
|
case 22: // swap #3 & #4
|
||
|
{
|
||
|
int speaker = LOWORD(w) - 20;
|
||
|
{ // swap handles
|
||
|
HSTREAM temp = chan[speaker];
|
||
|
chan[speaker] = chan[speaker + 1];
|
||
|
chan[speaker + 1] = temp;
|
||
|
}
|
||
|
{ // swap text
|
||
|
char temp1[MAX_PATH], temp2[MAX_PATH];
|
||
|
MESS(10 + speaker, WM_GETTEXT, MAX_PATH, temp1);
|
||
|
MESS(10 + speaker + 1, WM_GETTEXT, MAX_PATH, temp2);
|
||
|
MESS(10 + speaker, WM_SETTEXT, 0, temp2);
|
||
|
MESS(10 + speaker + 1, WM_SETTEXT, 0, temp1);
|
||
|
}
|
||
|
{ // swap mono switch states
|
||
|
int temp = MESS(30 + speaker * 2, BM_GETCHECK, 0, 0);
|
||
|
MESS(30 + speaker * 2, BM_SETCHECK, MESS(32 + speaker * 2, BM_GETCHECK, 0, 0), 0);
|
||
|
MESS(32 + speaker * 2, BM_SETCHECK, temp, 0);
|
||
|
temp = MESS(31 + speaker * 2, BM_GETCHECK, 0, 0);
|
||
|
MESS(31 + speaker * 2, BM_SETCHECK, MESS(33 + speaker * 2, BM_GETCHECK, 0, 0), 0);
|
||
|
MESS(33 + speaker * 2, BM_SETCHECK, temp, 0);
|
||
|
temp = IsWindowEnabled(ITEM(30 + speaker * 2));
|
||
|
EnableWindow(ITEM(30 + speaker * 2), IsWindowEnabled(ITEM(32 + speaker * 2)));
|
||
|
EnableWindow(ITEM(32 + speaker * 2), temp);
|
||
|
temp = IsWindowEnabled(ITEM(31 + speaker * 2));
|
||
|
EnableWindow(ITEM(31 + speaker * 2), IsWindowEnabled(ITEM(33 + speaker * 2)));
|
||
|
EnableWindow(ITEM(33 + speaker * 2), temp);
|
||
|
}
|
||
|
// update speaker flags
|
||
|
UpdateSpeakerFlags(speaker);
|
||
|
UpdateSpeakerFlags(speaker + 1);
|
||
|
}
|
||
|
return 1;
|
||
|
case 30: // left #1
|
||
|
case 31: // right #1
|
||
|
case 32: // left #2
|
||
|
case 33: // right #2
|
||
|
case 34: // left #3
|
||
|
case 35: // right #3
|
||
|
case 36: // right #4
|
||
|
case 37: // right #4
|
||
|
{
|
||
|
int speaker = (LOWORD(w) - 30) / 2;
|
||
|
UpdateSpeakerFlags(speaker);
|
||
|
}
|
||
|
return 1;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case WM_INITDIALOG:
|
||
|
win = h;
|
||
|
memset(&ofn, 0, sizeof(ofn));
|
||
|
ofn.lStructSize = sizeof(ofn);
|
||
|
ofn.hwndOwner = h;
|
||
|
ofn.nMaxFile = MAX_PATH;
|
||
|
ofn.Flags = OFN_HIDEREADONLY | OFN_EXPLORER;
|
||
|
ofn.lpstrFilter = "Streamable files\0*.mp3;*.mp2;*.mp1;*.ogg;*.wav;*.aif\0All files\0*.*\0\0";
|
||
|
// initialize BASS - default device
|
||
|
if (!BASS_Init(-1, 44100, 0, win, NULL)) {
|
||
|
Error("Can't initialize device");
|
||
|
EndDialog(h, 0);
|
||
|
break;
|
||
|
}
|
||
|
{ // check how many speakers the device supports
|
||
|
BASS_INFO i;
|
||
|
BASS_GetInfo(&i);
|
||
|
if (i.speakers < 4 && LOBYTE(GetVersion()) < 6) { // no extra speakers detected, enable them anyway? (on older Windows than Vista)
|
||
|
if (MessageBox(0, "Do you wish to enable \"speaker assignment\" anyway?", "No extra speakers detected", MB_ICONQUESTION | MB_YESNO) == IDYES) {
|
||
|
// reinitialize BASS - forcing speaker assignment
|
||
|
BASS_Free();
|
||
|
if (!BASS_Init(-1, 44100, BASS_DEVICE_SPEAKERS, win, NULL)) {
|
||
|
Error("Can't initialize device");
|
||
|
EndDialog(h, 0);
|
||
|
break;
|
||
|
}
|
||
|
BASS_GetInfo(&i); // get info again
|
||
|
}
|
||
|
}
|
||
|
if (i.speakers < 8) {
|
||
|
EnableWindow(GetDlgItem(h, 13), FALSE);
|
||
|
EnableWindow(GetDlgItem(h, 22), FALSE);
|
||
|
}
|
||
|
if (i.speakers < 6) {
|
||
|
EnableWindow(GetDlgItem(h, 12), FALSE);
|
||
|
EnableWindow(GetDlgItem(h, 21), FALSE);
|
||
|
}
|
||
|
if (i.speakers < 4) {
|
||
|
EnableWindow(GetDlgItem(h, 11), FALSE);
|
||
|
EnableWindow(GetDlgItem(h, 20), FALSE);
|
||
|
}
|
||
|
}
|
||
|
return 1;
|
||
|
|
||
|
case WM_DESTROY:
|
||
|
BASS_Free();
|
||
|
break;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
|
||
|
{
|
||
|
// check the correct BASS was loaded
|
||
|
if (HIWORD(BASS_GetVersion()) != BASSVERSION) {
|
||
|
MessageBox(0, "An incorrect version of BASS.DLL was loaded", 0, MB_ICONERROR);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
// main dialog
|
||
|
DialogBox(hInstance, MAKEINTRESOURCE(1000), NULL, dialogproc);
|
||
|
|
||
|
return 0;
|
||
|
}
|