Add WIN32 audio support, and protect against accidental restarts
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@4691 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
parent
a6e6888a2d
commit
0ce3c4c6f1
@ -62,6 +62,9 @@
|
||||
#ifdef __APPLE__
|
||||
# include <CoreAudio/AudioHardware.h>
|
||||
#endif // __APPLE__
|
||||
#ifdef WIN32
|
||||
# include <mmsystem.h>
|
||||
#endif // WIN32
|
||||
|
||||
|
||||
//
|
||||
@ -108,6 +111,12 @@ class SudokuSound {
|
||||
const AudioTimeStamp *time_out,
|
||||
void *client_data);
|
||||
#elif defined(WIN32)
|
||||
HWAVEOUT device;
|
||||
HGLOBAL header_handle;
|
||||
LPWAVEHDR header_ptr;
|
||||
HGLOBAL data_handle;
|
||||
LPSTR data_ptr;
|
||||
|
||||
#else
|
||||
# ifdef HAVE_ALSA_ASOUNDLIB_H
|
||||
snd_pcm_t *handle;
|
||||
@ -179,6 +188,39 @@ SudokuSound::SudokuSound() {
|
||||
sample_size = (int)format.mSampleRate / 20;
|
||||
|
||||
#elif defined(WIN32)
|
||||
WAVEFORMATEX format;
|
||||
|
||||
memset(&format, 0, sizeof(format));
|
||||
format.cbSize = sizeof(format);
|
||||
format.wFormatTag = WAVE_FORMAT_PCM;
|
||||
format.nChannels = 2;
|
||||
format.nSamplesPerSec = 44100;
|
||||
format.nAvgBytesPerSec = 44100 * 4;
|
||||
format.nBlockAlign = 4;
|
||||
format.wBitsPerSample = 16;
|
||||
|
||||
data_handle = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, format.nSamplesPerSec / 5);
|
||||
if (!data_handle) return;
|
||||
|
||||
data_ptr = (LPSTR)GlobalLock(data_handle);
|
||||
|
||||
header_handle = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, sizeof(WAVEHDR));
|
||||
if (!header_handle) return;
|
||||
|
||||
header_ptr = (WAVEHDR *)GlobalLock(header_handle);
|
||||
|
||||
header_ptr->lpData = data_ptr;
|
||||
header_ptr->dwBufferLength = format.nSamplesPerSec / 5;
|
||||
header_ptr->dwFlags = 0;
|
||||
header_ptr->dwLoops = 0;
|
||||
|
||||
if (waveOutOpen(&device, WAVE_MAPPER, &format, NULL, NULL, WAVE_ALLOWSYNC)
|
||||
!= MMSYSERR_NOERROR) return;
|
||||
|
||||
waveOutPrepareHeader(device, header_ptr, sizeof(WAVEHDR));
|
||||
|
||||
sample_size = 44100 / 20;
|
||||
|
||||
#else
|
||||
# ifdef HAVE_ALSA_ASOUNDLIB_H
|
||||
handle = NULL;
|
||||
@ -240,10 +282,22 @@ SudokuSound::SudokuSound() {
|
||||
// Cleanup the SudokuSound class
|
||||
SudokuSound::~SudokuSound() {
|
||||
#ifdef __APPLE__
|
||||
if (sample_size) {
|
||||
AudioDeviceStop(device, audio_cb);
|
||||
AudioDeviceRemoveIOProc(device, audio_cb);
|
||||
}
|
||||
|
||||
#elif defined(WIN32)
|
||||
if (sample_size) {
|
||||
waveOutClose(device);
|
||||
|
||||
GlobalUnlock(header_handle);
|
||||
GlobalFree(header_handle);
|
||||
|
||||
GlobalUnlock(data_handle);
|
||||
GlobalFree(data_handle);
|
||||
}
|
||||
|
||||
#else
|
||||
# ifdef HAVE_ALSA_ASOUNDLIB_H
|
||||
if (handle) {
|
||||
@ -307,7 +361,14 @@ void SudokuSound::play(char note) {
|
||||
usleep(50000);
|
||||
|
||||
#elif defined(WIN32)
|
||||
Beep(frequencies[note - 'A'], 50);
|
||||
if (sample_size) {
|
||||
memcpy(data_ptr, sample_data[note - 'A'], sample_size * 4);
|
||||
|
||||
waveOutWrite(device, header_ptr, sizeof(WAVEHDR));
|
||||
|
||||
Sleep(50);
|
||||
} else Beep(frequencies[note - 'A'], 50);
|
||||
|
||||
#else
|
||||
# ifdef HAVE_ALSA_ASOUNDLIB_H
|
||||
if (handle) {
|
||||
@ -567,10 +628,10 @@ Sudoku::Sudoku()
|
||||
{ "&Quit", FL_COMMAND | 'q', close_cb, 0, 0 },
|
||||
{ 0 },
|
||||
{ "&Difficulty", 0, 0, 0, FL_SUBMENU },
|
||||
{ "&Easy", FL_COMMAND | '1', diff_cb, (void *)"0", FL_MENU_RADIO },
|
||||
{ "&Medium", FL_COMMAND | '2', diff_cb, (void *)"1", FL_MENU_RADIO },
|
||||
{ "&Hard", FL_COMMAND | '3', diff_cb, (void *)"2", FL_MENU_RADIO },
|
||||
{ "&Impossible", FL_COMMAND | '4', diff_cb, (void *)"3", FL_MENU_RADIO },
|
||||
{ "&Easy", 0, diff_cb, (void *)"0", FL_MENU_RADIO },
|
||||
{ "&Medium", 0, diff_cb, (void *)"1", FL_MENU_RADIO },
|
||||
{ "&Hard", 0, diff_cb, (void *)"2", FL_MENU_RADIO },
|
||||
{ "&Impossible", 0, diff_cb, (void *)"3", FL_MENU_RADIO },
|
||||
{ 0 },
|
||||
{ "&Help", 0, 0, 0, FL_SUBMENU },
|
||||
{ "&About Sudoku", FL_F + 1, help_cb, 0, 0 },
|
||||
@ -586,7 +647,7 @@ Sudoku::Sudoku()
|
||||
prefs_.get("difficulty", difficulty_, 0);
|
||||
if (difficulty_ < 0 || difficulty_ > 3) difficulty_ = 0;
|
||||
|
||||
items[7 + difficulty_].flags |= FL_MENU_VALUE;
|
||||
items[8 + difficulty_].flags |= FL_MENU_VALUE;
|
||||
|
||||
menubar_ = new Fl_Sys_Menu_Bar(0, 0, 3 * GROUP_SIZE, 25);
|
||||
menubar_->menu(items);
|
||||
@ -727,13 +788,16 @@ Sudoku::close_cb(Fl_Widget *widget, void *) {
|
||||
void
|
||||
Sudoku::diff_cb(Fl_Widget *widget, void *d) {
|
||||
Sudoku *s = (Sudoku *)(widget->window() ? widget->window() : widget);
|
||||
int diff = atoi((char *)d);
|
||||
|
||||
s->difficulty_ = atoi((char *)d);
|
||||
if (diff != s->difficulty_) {
|
||||
s->difficulty_ = diff;
|
||||
s->new_game(s->seed_);
|
||||
s->set_title();
|
||||
|
||||
prefs_.set("difficulty", s->difficulty_);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Show the on-line help...
|
||||
@ -747,7 +811,7 @@ Sudoku::help_cb(Fl_Widget *, void *) {
|
||||
"<HEAD>\n"
|
||||
"<TITLE>Sudoku Help</TITLE>\n"
|
||||
"</HEAD>\n"
|
||||
"<BODY>\n"
|
||||
"<BODY BGCOLOR='#ffffff'>\n"
|
||||
|
||||
"<H2>About the Game</H2>\n"
|
||||
|
||||
@ -839,7 +903,15 @@ Sudoku::load_game() {
|
||||
// Create a new game...
|
||||
void
|
||||
Sudoku::new_cb(Fl_Widget *widget, void *) {
|
||||
((Sudoku *)(widget->window()))->new_game(time(NULL));
|
||||
Sudoku *s = (Sudoku *)(widget->window() ? widget->window() : widget);
|
||||
|
||||
if (s->grid_cells_[0][0]->color() != FL_GREEN) {
|
||||
if (!fl_choice("Are you sure you want to change the difficulty level and "
|
||||
"discard the current game?", "Keep Current Game", "Start New Game",
|
||||
NULL)) return;
|
||||
}
|
||||
|
||||
s->new_game(time(NULL));
|
||||
}
|
||||
|
||||
|
||||
|
@ -71,7 +71,7 @@
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="fltkd.lib wsock32.lib comctl32.lib"
|
||||
AdditionalDependencies="fltkd.lib winmm.lib wsock32.lib comctl32.lib"
|
||||
OutputFile="../test/sudokud.exe"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="true"
|
||||
@ -166,7 +166,7 @@
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="fltk.lib wsock32.lib comctl32.lib"
|
||||
AdditionalDependencies="fltk.lib winmm.lib wsock32.lib comctl32.lib"
|
||||
OutputFile="../test/sudoku.exe"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="true"
|
||||
|
Loading…
Reference in New Issue
Block a user