view src/ntplay.c @ 1111:184461bc8de4

[xemacs-hg @ 2002-11-18 06:52:23 by ben] warning fixes, etc. * s/cygwin32.h: -fvtable-thunks is obsolete in GCC 3 and generates warnings. * s/mingw32.h: * s/windowsnt.h: Comment fixes. * emodules.h: Fix warnings from redefining symbols. * eval.c: Fix C++ errors -- no automatic casting between function pointers and void *, function declarations inside of functions not allowed. * event-Xt.c (emacs_Xt_enqueue_focus_event): Warning fixes. * fileio.c (Ffile_truename): Warning fixes. Use LOCAL_TO_WIN32_FILE_FORMAT rather than duplicating it. * glyphs-x.c: Fix style. * intl-auto-encap-win32.c: * intl-auto-encap-win32.h: * intl-encap-win32.c: * intl-encap-win32.c (qxeRegConnectRegistry): * syswindows.h (RegConnectRegistry): DdeCreateStringHandle needs to be manual due to new Cygwin bug. * intl-win32.c: wcslen/wcscmp don't seem to exist under G++ 3, Cygwin. * lisp.h: * lisp-union.h: * lisp-disunion.h: * process-unix.c (unix_send_process): Ugh, C needs volatile and C++ must not have volatile. Remove previous volatile hacks, which don't seem to be working any more. * sheap.c (STATIC_HEAP_SLOP): Try to get a working Cygwin build with old unexec. * sheap.c (more_static_core): No NL's in literals allowed. * symbols.c (Fset): Fix C++ errors. * syswindows.h: Fix Cygwin complaints now that some missing structs have been added. aclocal.m4: Disable shared library modules under Cygwin for the moment, since we need some more tricky coding done and I don't have the time right now. configure.in, configure.usage: code-files.el, loadhist.el: Fix warnings. package-get.el: Fix warnings. NOTE: This was already fixed awhile ago, but reverted by Steve Y. Please be careful. postgresql/Makefile.in.in: Removed. Move common stuff into modues/common/Makefile.common. (Also add extraclean target and a couple of other fixes in that file.) postgresql/configure.ac: Extract out common configure stuff into modules/common/configure-{pre,post}.ac. postgresql/postgresql.c: Fix warning. ldap/Makefile.in.in: Removed. Move common stuff into modues/common/Makefile.common. (Also add extraclean target and a couple of other fixes in that file.) ldap/configure.ac: Extract out common configure stuff into modules/common/configure-{pre,post}.ac. common/Makefile.common: Common stuff is here.
author ben
date Mon, 18 Nov 2002 06:53:08 +0000
parents 943eaba38521
children a8d8f419b459
line wrap: on
line source

/* Sound in windows nt XEmacs.
   Copyright (C) 1998 Andy Piper.
   Copyright (C) 2001 Ben Wing.

This file is part of XEmacs.

XEmacs is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.

XEmacs is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
along with XEmacs; see the file COPYING.  If not, write to the Free
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.*/

/* Synched up with: Not in FSF. */

/* This file Mule-ized by Ben Wing, 5-15-01. */

#include <config.h>
#include "lisp.h"

#include "sound.h"
#include "syswindows.h"

#include "sysfile.h"

static int play_sound_data_1 (UChar_Binary *data, int length,
			      int volume, int convert);

void
play_sound_file (Extbyte *sound_file, int volume)
{
  DWORD flags = SND_ASYNC | SND_NODEFAULT | SND_FILENAME;
  Lisp_Object fname =
    Ffile_name_nondirectory (build_tstr_string (sound_file));
  Extbyte *fnameext;

  CHECK_STRING (fname);
  LISP_STRING_TO_TSTR (fname, fnameext);

  if (qxeSearchPath (NULL, fnameext, NULL, 0, NULL, NULL) == 0)
    {
      /* file isn't in the path so read it as data */
      int size;
      UChar_Binary *data;
      int ofd = qxe_open (XSTRING_DATA (fname), O_RDONLY | OPEN_BINARY, 0);
      
      if (ofd <0)
	return;

      size = lseek (ofd, 0, SEEK_END);
      data = (UChar_Binary *) xmalloc (size);
      lseek (ofd, 0, SEEK_SET);
      
      if (!data)
	{
	  retry_close (ofd);
	  return;
	}

      if (retry_read (ofd, data, size) != size)
	{
	  retry_close (ofd);
	  xfree (data);
	  return;
	}
      retry_close (ofd);
      
      play_sound_data_1 (data, size, 100, FALSE);
    }
  else 
    qxePlaySound (fnameext, NULL, flags);
}

/* mswindows can't cope with playing a sound from alloca space so we
   have to convert if necessary */
static int
play_sound_data_1 (UChar_Binary *data, int length, int volume,
		   int convert_to_malloc)
{
  DWORD flags = SND_ASYNC | SND_MEMORY | SND_NODEFAULT;
  static UChar_Binary *sound_data = 0;
  if (sound_data)
    {
      qxePlaySound (NULL, NULL, flags);
      xfree (sound_data);
      sound_data = 0;
    }

  if (convert_to_malloc)
    {
      sound_data = (UChar_Binary *) xmalloc (length);
      memcpy (sound_data, data, length);
    }
  else
    sound_data = data;

  qxePlaySound ((Extbyte *) sound_data, NULL, flags);

  /* #### Error handling? */ 
  return 1;
}

int
play_sound_data (UChar_Binary *data, int length, int volume)
{
  return play_sound_data_1 (data, length, volume, TRUE);
}