+ sound_perror ("Error writing to sound device");
+}
+
+/* END: Non Windows functions */
+#else /* WINDOWSNT */
+
+/* BEGIN: Windows specific functions */
+
+static int
+do_play_sound (psz_file, ui_volume)
+ const char *psz_file;
+ unsigned long ui_volume;
+{
+ int i_result = 0;
+ MCIERROR mci_error = 0;
+ char sz_cmd_buf[520] = {0};
+ char sz_ret_buf[520] = {0};
+ MMRESULT mm_result = MMSYSERR_NOERROR;
+ unsigned long ui_volume_org = 0;
+ BOOL b_reset_volume = FALSE;
+
+ memset (sz_cmd_buf, 0, sizeof(sz_cmd_buf));
+ memset (sz_ret_buf, 0, sizeof(sz_ret_buf));
+ sprintf (sz_cmd_buf,
+ "open \"%s\" alias GNUEmacs_PlaySound_Device wait",
+ psz_file);
+ mci_error = mciSendString (sz_cmd_buf, sz_ret_buf, 520, NULL);
+ if (mci_error != 0)
+ {
+ sound_warning ("The open mciSendString command failed to open\n"
+ "the specified sound file");
+ i_result = (int) mci_error;
+ return i_result;
+ }
+ if ((ui_volume > 0) && (ui_volume != UINT_MAX))
+ {
+ mm_result = waveOutGetVolume ((HWAVEOUT) WAVE_MAPPER, &ui_volume_org);
+ if (mm_result == MMSYSERR_NOERROR)
+ {
+ b_reset_volume = TRUE;
+ mm_result = waveOutSetVolume ((HWAVEOUT) WAVE_MAPPER, ui_volume);
+ if ( mm_result != MMSYSERR_NOERROR)
+ {
+ sound_warning ("waveOutSetVolume failed to set the volume level\n"
+ "of the WAVE_MAPPER device.\n"
+ "As a result, the user selected volume level will\n"
+ "not be used.");
+ }
+ }
+ else
+ {
+ sound_warning ("waveOutGetVolume failed to obtain the original\n"
+ "volume level of the WAVE_MAPPER device.\n"
+ "As a result, the user selected volume level will\n"
+ "not be used.");
+ }
+ }
+ memset (sz_cmd_buf, 0, sizeof(sz_cmd_buf));
+ memset (sz_ret_buf, 0, sizeof(sz_ret_buf));
+ strcpy (sz_cmd_buf, "play GNUEmacs_PlaySound_Device wait");
+ mci_error = mciSendString (sz_cmd_buf, sz_ret_buf, 520, NULL);
+ if (mci_error != 0)
+ {
+ sound_warning ("The play mciSendString command failed to play the\n"
+ "opened sound file.");
+ i_result = (int) mci_error;
+ }
+ memset (sz_cmd_buf, 0, sizeof(sz_cmd_buf));
+ memset (sz_ret_buf, 0, sizeof(sz_ret_buf));
+ strcpy (sz_cmd_buf, "close GNUEmacs_PlaySound_Device wait");
+ mci_error = mciSendString (sz_cmd_buf, sz_ret_buf, 520, NULL);
+ if (b_reset_volume == TRUE)
+ {
+ mm_result=waveOutSetVolume ((HWAVEOUT) WAVE_MAPPER, ui_volume_org);
+ if (mm_result != MMSYSERR_NOERROR)
+ {
+ sound_warning ("waveOutSetVolume failed to reset the original volume\n"
+ "level of the WAVE_MAPPER device.");
+ }
+ }
+ return i_result;