view src/ntplay.c @ 5872:f9e59cd39a9a

Clean up #'read-quoted-char, support help-event-list there. lisp/changeLog addition: 2015-03-14 Aidan Kehoe <kehoea@parhasard.net> * simple.el (quoted-insert): Update the docstring here, syncing GNU's, especially mentioning read-quoted-char-radix. * cmdloop.el: * cmdloop.el (read-quoted-char-radix): Move this up here, outside the functions. * cmdloop.el (read-function-key-map): New label, reading and replacing characters from function-key-map if appropriate. * cmdloop.el (read-quoted-char): Multiple changes: -- Take advantage of help-event-list, but be careful not to have any keystrokes with character equivalents in it, so the user can type C-q C-h and have the expected result. -- Use function-key-map, as does #'read-char and #'read-exclusive-char, helpful for character composition under X11. -- Pop up the help window ourselves if, e.g. F1 arrives on a TTY via function-key-map, event-stream won't have done it. -- Error if no keystroke that can be converted into a character is specified, don't just insert ?\x00 as we used to and as does GNU -- Use #'digit-char-p instead of reimplementing it. -- Fix a bug of mine where I wasn't consistent about treating character codes as Unicode.
author Aidan Kehoe <kehoea@parhasard.net>
date Tue, 17 Mar 2015 12:22:50 +0000
parents 308d34e9f07d
children
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 3 of the License, 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.  If not, see <http://www.gnu.org/licenses/>. */

/* 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 (Binbyte *data, int length,
			      int volume, int convert);

void
nt_play_sound_file (Lisp_Object path, int UNUSED (volume))
{
  DWORD flags = SND_ASYNC | SND_NODEFAULT | SND_FILENAME;
  Lisp_Object fname = Ffile_name_nondirectory (path);
  Extbyte *fnameext;

  fnameext = LISP_STRING_TO_TSTR (fname);

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

      size = lseek (ofd, 0, SEEK_END);
      data = xnew_binbytes (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 (Binbyte *data, int length, int UNUSED (volume),
		   int convert_to_malloc)
{
  DWORD flags = SND_ASYNC | SND_MEMORY | SND_NODEFAULT;
  static Binbyte *sound_data = 0;
  if (sound_data)
    {
      qxePlaySound (NULL, NULL, flags);
      xfree (sound_data);
      sound_data = 0;
    }

  if (convert_to_malloc)
    {
      sound_data = xnew_binbytes (length);
      memcpy (sound_data, data, length);
    }
  else
    sound_data = data;

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

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

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