Mercurial > hg > xemacs-beta
annotate src/linuxplay.c @ 5492:e82f5b7010fe
Merge some stuff in man, fix up Makefile
-------------------- ChangeLog entries follow: --------------------
man/ChangeLog addition:
2010-02-19 Ben Wing <ben@xemacs.org>
* widget.texi:
* widget.texi (Top):
* widget.texi (Introduction):
* widget.texi (User Interface):
* widget.texi (Programming Example):
* widget.texi (Setting Up the Buffer):
* widget.texi (Basic Types):
* widget.texi (link):
* widget.texi (url-link):
* widget.texi (info-link):
* widget.texi (push-button):
* widget.texi (editable-field):
* widget.texi (text):
* widget.texi (menu-choice):
* widget.texi (radio-button-choice):
* widget.texi (item):
* widget.texi (choice-item):
* widget.texi (toggle):
* widget.texi (checkbox):
* widget.texi (checklist):
* widget.texi (editable-list):
* widget.texi (group):
* widget.texi (Sexp Types):
* widget.texi (constants):
* widget.texi (generic):
* widget.texi (atoms):
* widget.texi (composite):
* widget.texi (Widget Properties):
* widget.texi (Defining New Widgets):
* widget.texi (Widget Browser):
* widget.texi (Widget Minor Mode):
* widget.texi (Utilities):
* widget.texi (Widget Wishlist):
* widget.texi (Widget Internals):
* widget.texi (GNU Free Documentation License):
* widget.texi (Index):
Sync with FSF 23.1.92.
2010-02-19 Ben Wing <ben@xemacs.org>
* texinfo/fdl.texi: New file.
* texinfo/texinfo.texi:
* texinfo/texinfo.texi (Top):
* texinfo/texinfo.texi (Copying Conditions):
* texinfo/texinfo.texi (Overview):
* texinfo/texinfo.texi (Reporting Bugs):
* texinfo/texinfo.texi (Using Texinfo):
* texinfo/texinfo.texi (Output Formats):
* texinfo/texinfo.texi (Info Files):
* texinfo/texinfo.texi (Printed Books):
* texinfo/texinfo.texi (Formatting Commands):
* texinfo/texinfo.texi (Conventions):
* texinfo/texinfo.texi (Comments):
* texinfo/texinfo.texi (Minimum):
* texinfo/texinfo.texi (Six Parts):
* texinfo/texinfo.texi (Short Sample):
* texinfo/texinfo.texi (History):
* texinfo/texinfo.texi (Texinfo Mode):
* texinfo/texinfo.texi (Texinfo Mode Overview):
* texinfo/texinfo.texi (XEmacs Editing):
* texinfo/texinfo.texi (Inserting):
* texinfo/texinfo.texi (Showing the Structure):
* texinfo/texinfo.texi (Updating Nodes and Menus):
* texinfo/texinfo.texi (Updating Commands):
* texinfo/texinfo.texi (Updating Requirements):
* texinfo/texinfo.texi (Other Updating Commands):
* texinfo/texinfo.texi (Info Formatting):
* texinfo/texinfo.texi (Printing):
* texinfo/texinfo.texi (Texinfo Mode Summary):
* texinfo/texinfo.texi (Beginning a File):
* texinfo/texinfo.texi (Sample Beginning):
* texinfo/texinfo.texi (Texinfo File Header):
* texinfo/texinfo.texi (First Line):
* texinfo/texinfo.texi (Start of Header):
* texinfo/texinfo.texi (setfilename):
* texinfo/texinfo.texi (settitle):
* texinfo/texinfo.texi (End of Header):
* texinfo/texinfo.texi (Document Permissions):
* texinfo/texinfo.texi (copying):
* texinfo/texinfo.texi (insertcopying):
* texinfo/texinfo.texi (Titlepage & Copyright Page):
* texinfo/texinfo.texi (titlepage):
* texinfo/texinfo.texi (titlefont center sp):
* texinfo/texinfo.texi (title subtitle author):
* texinfo/texinfo.texi (Copyright):
* texinfo/texinfo.texi (end titlepage):
* texinfo/texinfo.texi (headings on off):
* texinfo/texinfo.texi (Contents):
* texinfo/texinfo.texi (The Top Node):
* texinfo/texinfo.texi (Top Node Example):
* texinfo/texinfo.texi (Master Menu Parts):
* texinfo/texinfo.texi (Global Document Commands):
* texinfo/texinfo.texi (documentdescription):
* texinfo/texinfo.texi (setchapternewpage):
* texinfo/texinfo.texi (paragraphindent):
* texinfo/texinfo.texi (firstparagraphindent):
* texinfo/texinfo.texi (exampleindent):
* texinfo/texinfo.texi (Software Copying Permissions):
* texinfo/texinfo.texi (Ending a File):
* texinfo/texinfo.texi (Printing Indices & Menus):
* texinfo/texinfo.texi (File End):
* texinfo/texinfo.texi (Structuring):
* texinfo/texinfo.texi (Tree Structuring):
* texinfo/texinfo.texi (Structuring Command Types):
* texinfo/texinfo.texi (makeinfo top):
* texinfo/texinfo.texi (chapter):
* texinfo/texinfo.texi (unnumbered & appendix):
* texinfo/texinfo.texi (majorheading & chapheading):
* texinfo/texinfo.texi (section):
* texinfo/texinfo.texi (unnumberedsec appendixsec heading):
* texinfo/texinfo.texi (subsection):
* texinfo/texinfo.texi (unnumberedsubsec appendixsubsec subheading):
* texinfo/texinfo.texi (subsubsection):
* texinfo/texinfo.texi (Raise/lower sections):
* texinfo/texinfo.texi (Nodes):
* texinfo/texinfo.texi (Two Paths):
* texinfo/texinfo.texi (Node Menu Illustration):
* texinfo/texinfo.texi (node):
* texinfo/texinfo.texi (Node Names):
* texinfo/texinfo.texi (Writing a Node):
* texinfo/texinfo.texi (Node Line Tips):
* texinfo/texinfo.texi (Node Line Requirements):
* texinfo/texinfo.texi (First Node):
* texinfo/texinfo.texi (makeinfo top command):
* texinfo/texinfo.texi (makeinfo Pointer Creation):
* texinfo/texinfo.texi (anchor):
* texinfo/texinfo.texi (Menus):
* texinfo/texinfo.texi (Menu Location):
* texinfo/texinfo.texi (Writing a Menu):
* texinfo/texinfo.texi (Menu Parts):
* texinfo/texinfo.texi (Less Cluttered Menu Entry):
* texinfo/texinfo.texi (Menu Example):
* texinfo/texinfo.texi (Other Info Files):
* texinfo/texinfo.texi (Cross References):
* texinfo/texinfo.texi (References):
* texinfo/texinfo.texi (Cross Reference Commands):
* texinfo/texinfo.texi (Cross Reference Parts):
* texinfo/texinfo.texi (xref):
* texinfo/texinfo.texi (Reference Syntax):
* texinfo/texinfo.texi (One Argument):
* texinfo/texinfo.texi (Two Arguments):
* texinfo/texinfo.texi (Three Arguments):
* texinfo/texinfo.texi (Four and Five Arguments):
* texinfo/texinfo.texi (Top Node Naming):
* texinfo/texinfo.texi (ref):
* texinfo/texinfo.texi (pxref):
* texinfo/texinfo.texi (inforef):
* texinfo/texinfo.texi (uref):
* texinfo/texinfo.texi (cite):
* texinfo/texinfo.texi (Marking Text):
* texinfo/texinfo.texi (Indicating):
* texinfo/texinfo.texi (Useful Highlighting):
* texinfo/texinfo.texi (code):
* texinfo/texinfo.texi (kbd):
* texinfo/texinfo.texi (key):
* texinfo/texinfo.texi (samp):
* texinfo/texinfo.texi (verb):
* texinfo/texinfo.texi (var):
* texinfo/texinfo.texi (env):
* texinfo/texinfo.texi (file):
* texinfo/texinfo.texi (command):
* texinfo/texinfo.texi (option):
* texinfo/texinfo.texi (dfn):
* texinfo/texinfo.texi (abbr):
* texinfo/texinfo.texi (acronym):
* texinfo/texinfo.texi (indicateurl):
* texinfo/texinfo.texi (email):
* texinfo/texinfo.texi (Emphasis):
* texinfo/texinfo.texi (emph & strong):
* texinfo/texinfo.texi (Smallcaps):
* texinfo/texinfo.texi (Fonts):
* texinfo/texinfo.texi (Quotations and Examples):
* texinfo/texinfo.texi (Block Enclosing Commands):
* texinfo/texinfo.texi (quotation):
* texinfo/texinfo.texi (example):
* texinfo/texinfo.texi (verbatim):
* texinfo/texinfo.texi (verbatiminclude):
* texinfo/texinfo.texi (lisp):
* texinfo/texinfo.texi (small):
* texinfo/texinfo.texi (display):
* texinfo/texinfo.texi (format):
* texinfo/texinfo.texi (exdent):
* texinfo/texinfo.texi (flushleft & flushright):
* texinfo/texinfo.texi (noindent):
* texinfo/texinfo.texi (indent):
* texinfo/texinfo.texi (cartouche):
* texinfo/texinfo.texi (Lists and Tables):
* texinfo/texinfo.texi (Introducing Lists):
* texinfo/texinfo.texi (itemize):
* texinfo/texinfo.texi (enumerate):
* texinfo/texinfo.texi (Two-column Tables):
* texinfo/texinfo.texi (table):
* texinfo/texinfo.texi (ftable vtable):
* texinfo/texinfo.texi (itemx):
* texinfo/texinfo.texi (Multi-column Tables):
* texinfo/texinfo.texi (Multitable Column Widths):
* texinfo/texinfo.texi (Multitable Rows):
* texinfo/texinfo.texi (Special Displays):
* texinfo/texinfo.texi (Floats):
* texinfo/texinfo.texi (float):
* texinfo/texinfo.texi (caption shortcaption):
* texinfo/texinfo.texi (listoffloats):
* texinfo/texinfo.texi (Images):
* texinfo/texinfo.texi (Image Syntax):
* texinfo/texinfo.texi (Image Scaling):
* texinfo/texinfo.texi (Footnotes):
* texinfo/texinfo.texi (Footnote Commands):
* texinfo/texinfo.texi (Footnote Styles):
* texinfo/texinfo.texi (Indices):
* texinfo/texinfo.texi (Index Entries):
* texinfo/texinfo.texi (Predefined Indices):
* texinfo/texinfo.texi (Indexing Commands):
* texinfo/texinfo.texi (Combining Indices):
* texinfo/texinfo.texi (syncodeindex):
* texinfo/texinfo.texi (synindex):
* texinfo/texinfo.texi (New Indices):
* texinfo/texinfo.texi (Insertions):
* texinfo/texinfo.texi (Atsign Braces Comma):
* texinfo/texinfo.texi (Inserting an Atsign):
* texinfo/texinfo.texi (Inserting Braces):
* texinfo/texinfo.texi (Inserting a Comma):
* texinfo/texinfo.texi (Inserting Quote Characters):
* texinfo/texinfo.texi (Inserting Space):
* texinfo/texinfo.texi (Not Ending a Sentence):
* texinfo/texinfo.texi (Ending a Sentence):
* texinfo/texinfo.texi (Multiple Spaces):
* texinfo/texinfo.texi (frenchspacing):
* texinfo/texinfo.texi (dmn):
* texinfo/texinfo.texi (Inserting Accents):
* texinfo/texinfo.texi (Inserting Quotation Marks):
* texinfo/texinfo.texi (Dots Bullets):
* texinfo/texinfo.texi (dots):
* texinfo/texinfo.texi (bullet):
* texinfo/texinfo.texi (TeX and copyright):
* texinfo/texinfo.texi (tex):
* texinfo/texinfo.texi (copyright symbol):
* texinfo/texinfo.texi (registered symbol):
* texinfo/texinfo.texi (euro):
* texinfo/texinfo.texi (pounds):
* texinfo/texinfo.texi (textdegree):
* texinfo/texinfo.texi (minus):
* texinfo/texinfo.texi (geq leq):
* texinfo/texinfo.texi (math):
* texinfo/texinfo.texi (Click Sequences):
* texinfo/texinfo.texi (Glyphs):
* texinfo/texinfo.texi (Glyphs Summary):
* texinfo/texinfo.texi (result):
* texinfo/texinfo.texi (expansion):
* texinfo/texinfo.texi (Print Glyph):
* texinfo/texinfo.texi (Error Glyph):
* texinfo/texinfo.texi (Equivalence):
* texinfo/texinfo.texi (Point Glyph):
* texinfo/texinfo.texi (Breaks):
* texinfo/texinfo.texi (Break Commands):
* texinfo/texinfo.texi (Line Breaks):
* texinfo/texinfo.texi (- and hyphenation):
* texinfo/texinfo.texi (allowcodebreaks):
* texinfo/texinfo.texi (w):
* texinfo/texinfo.texi (tie):
* texinfo/texinfo.texi (sp):
* texinfo/texinfo.texi (page):
* texinfo/texinfo.texi (group):
* texinfo/texinfo.texi (need):
* texinfo/texinfo.texi (Definition Commands):
* texinfo/texinfo.texi (Def Cmd Template):
* texinfo/texinfo.texi (Def Cmd Continuation Lines):
* texinfo/texinfo.texi (Optional Arguments):
* texinfo/texinfo.texi (deffnx):
* texinfo/texinfo.texi (Def Cmds in Detail):
* texinfo/texinfo.texi (Functions Commands):
* texinfo/texinfo.texi (Variables Commands):
* texinfo/texinfo.texi (Typed Functions):
* texinfo/texinfo.texi (Typed Variables):
* texinfo/texinfo.texi (Data Types):
* texinfo/texinfo.texi (Abstract Objects):
* texinfo/texinfo.texi (Object-Oriented Variables):
* texinfo/texinfo.texi (Object-Oriented Methods):
* texinfo/texinfo.texi (Defining Macros):
* texinfo/texinfo.texi (Invoking Macros):
* texinfo/texinfo.texi (Macro Details):
* texinfo/texinfo.texi (alias):
* texinfo/texinfo.texi (definfoenclose):
* texinfo/texinfo.texi (Hardcopy):
* texinfo/texinfo.texi (Use TeX):
* texinfo/texinfo.texi (Format with tex/texindex):
* texinfo/texinfo.texi (Format with texi2dvi):
* texinfo/texinfo.texi (Print with lpr):
* texinfo/texinfo.texi (Within XEmacs):
* texinfo/texinfo.texi (Texinfo Mode Printing):
* texinfo/texinfo.texi (Compile-Command):
* texinfo/texinfo.texi (Requirements Summary):
* texinfo/texinfo.texi (Preparing for TeX):
* texinfo/texinfo.texi (Overfull hboxes):
* texinfo/texinfo.texi (smallbook):
* texinfo/texinfo.texi (A4 Paper):
* texinfo/texinfo.texi (pagesizes):
* texinfo/texinfo.texi (Cropmarks and Magnification):
* texinfo/texinfo.texi (PDF Output):
* texinfo/texinfo.texi (Obtaining TeX):
* texinfo/texinfo.texi (Creating and Installing Info Files):
* texinfo/texinfo.texi (Creating an Info File):
* texinfo/texinfo.texi (makeinfo advantages):
* texinfo/texinfo.texi (Invoking makeinfo):
* texinfo/texinfo.texi (makeinfo options):
* texinfo/texinfo.texi (Pointer Validation):
* texinfo/texinfo.texi (makeinfo in XEmacs):
* texinfo/texinfo.texi (texinfo-format commands):
* texinfo/texinfo.texi (Batch Formatting):
* texinfo/texinfo.texi (Tag and Split Files):
* texinfo/texinfo.texi (Installing an Info File):
* texinfo/texinfo.texi (Directory File):
* texinfo/texinfo.texi (New Info File):
* texinfo/texinfo.texi (Other Info Directories):
* texinfo/texinfo.texi (Installing Dir Entries):
* texinfo/texinfo.texi (Invoking install-info):
* texinfo/texinfo.texi (Generating HTML):
* texinfo/texinfo.texi (HTML Translation):
* texinfo/texinfo.texi (HTML Splitting):
* texinfo/texinfo.texi (HTML CSS):
* texinfo/texinfo.texi (HTML Xref):
* texinfo/texinfo.texi (HTML Xref Link Basics):
* texinfo/texinfo.texi (HTML Xref Node Name Expansion):
* texinfo/texinfo.texi (HTML Xref Command Expansion):
* texinfo/texinfo.texi (HTML Xref 8-bit Character Expansion):
* texinfo/texinfo.texi (HTML Xref Mismatch):
* texinfo/texinfo.texi (Command List):
* texinfo/texinfo.texi (Command Syntax):
* texinfo/texinfo.texi (Tips):
* texinfo/texinfo.texi (Sample Texinfo Files):
* texinfo/texinfo.texi (Short Sample Texinfo File):
* texinfo/texinfo.texi (GNU Sample Texts):
* texinfo/texinfo.texi (Invoking sample):
* texinfo/texinfo.texi (GNU Free Documentation License):
* texinfo/texinfo.texi (Index):
* texinfo/texinfo.texi (Verbatim Copying License):
* texinfo/texinfo.texi (All-permissive Copying License):
* texinfo/texinfo.texi (Include Files):
* texinfo/texinfo.texi (Using Include Files):
* texinfo/texinfo.texi (texinfo-multiple-files-update):
* texinfo/texinfo.texi (Include Files Requirements):
* texinfo/texinfo.texi (Sample Include File):
* texinfo/texinfo.texi (Include Files Evolution):
* texinfo/texinfo.texi (Headings):
* texinfo/texinfo.texi (Headings Introduced):
* texinfo/texinfo.texi (Heading Format):
* texinfo/texinfo.texi (Heading Choice):
* texinfo/texinfo.texi (Custom Headings):
* texinfo/texinfo.texi (Catching Mistakes):
* texinfo/texinfo.texi (makeinfo Preferred):
* texinfo/texinfo.texi (Debugging with Info):
* texinfo/texinfo.texi (Debugging with TeX):
* texinfo/texinfo.texi (Using texinfo-show-structure):
* texinfo/texinfo.texi (Using occur):
* texinfo/texinfo.texi (Running Info-Validate):
* texinfo/texinfo.texi (Using Info-validate):
* texinfo/texinfo.texi (Unsplit):
* texinfo/texinfo.texi (Tagifying):
* texinfo/texinfo.texi (Splitting):
* texinfo/texinfo.texi (Refilling Paragraphs):
* texinfo/texinfo.texi (Command and Variable Index):
* texinfo/texinfo.texi (General Index):
* texinfo/version.texi: New file.
Sync with FSF 23.1.92. Make new directory to hold the files needed
to generate texinfo.info, since there are three such files now.
2010-02-19 Ben Wing <ben@xemacs.org>
* Makefile:
* Makefile (src_files1):
* Makefile (DIR):
* Makefile (texinfo-srcs):
* Makefile ($(INFODIR)/widget.info):
* Makefile ($(INFODIR)/texinfo.info):
* Makefile (.PHONY):
* Makefile (texinfo.dvi):
* Makefile (texinfo.pdf):
* Makefile ($(HTMLDIR)/widget.html):
* Makefile ($(HTMLDIR)/texinfo.html):
Incorporate texinfo.texi moving to a subdirectory texinfo/.
Do some tricks to reduce the amount of duplication while still
maintaining compatible with non-GNU make (at least, with
Solaris make).
* doclicense.texi: New file.
* info.texi:
* info.texi (Top):
* info.texi (Getting Started):
* info.texi (Help-Small-Screen):
* info.texi (Help):
* info.texi (Help-P):
* info.texi (Help-^L):
* info.texi (Help-Inv):
* info.texi (Help-]):
* info.texi (Help-M):
* info.texi (Help-FOO):
* info.texi (Help-Xref):
* info.texi (Help-Int):
* info.texi (Help-Q):
* info.texi (Advanced):
* info.texi (Search Text):
* info.texi (Search Index):
* info.texi (Go to node):
* info.texi (Choose menu subtopic):
* info.texi (Create Info buffer):
* info.texi (XEmacs Info Variables):
* info.texi (Expert Info):
* info.texi (Add):
* info.texi (Menus):
* info.texi (Cross-refs):
* info.texi (Help-Cross):
* info.texi (Tags):
* info.texi (Checking):
* info.texi (Index):
* texinfo.tex:
* texinfo.tex (paragraphindent{%):
* texinfo.tex (sectionheading will have):
* texinfo.tex (chapterzzz{#3}%):
* texinfo.tex (subsubsection = \numberedsubsubsec):
* texinfo.tex (subsubsection = \appendixsubsubsec):
* texinfo.tex (subsubsection = \unnumberedsubsubsec):
* texinfo.tex (sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%):
* texinfo.tex (sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%):
* texinfo.tex (sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%):
* texinfo.tex (sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%):
* texinfo.tex (sectionheading{#1}{subsec}{Yappendix}%):
* texinfo.tex (sectionheading{#1}{subsec}{Ynothing}%):
* texinfo.tex (sectionheading{#1}{subsubsec}{Ynumbered}%):
* texinfo.tex (sectionheading{#1}{subsubsec}{Yappendix}%):
* texinfo.tex (sectionheading{#1}{subsubsec}{Ynothing}%):
* texinfo.tex (sectionheading{#1}{subsubsec}{Yomitfromtoc}{}):
* texinfo.tex (sectionheading to do the printing.):
* texinfo.tex (sectionlevel}{#1}{#4}%):
* texinfo.tex (sectionheading, q.v.):
Sync with FSF 23.1.92.
| author | Ben Wing <ben@xemacs.org> |
|---|---|
| date | Fri, 19 Feb 2010 22:39:19 -0600 |
| parents | 5bc9d592760f |
| children | ed624ab64583 |
| rev | line source |
|---|---|
| 428 | 1 /* linuxplay.c - play a sound file on the speaker |
| 2 ** | |
| 3 ** Copyright (C) 1995,96 by Markus Gutschke (gutschk@math.uni-muenster.de) | |
| 4 ** This is version 1.3 of linuxplay.c, with platform-independent functions | |
| 5 ** moved to a different file by Robert Bihlmeyer <robbe@orcus.priv.at>. | |
| 6 ** | |
| 7 ** Parts of this code were inspired by sunplay.c, which is copyright 1989 by | |
| 8 ** Jef Poskanzer and 1991,92 by Jamie Zawinski; c.f. sunplay.c for further | |
| 9 ** information. | |
| 10 ** | |
| 11 ** Permission to use, copy, modify, and distribute this software and its | |
| 12 ** documentation for any purpose and without fee is hereby granted, provided | |
| 13 ** that the above copyright notice appear in all copies and that both that | |
| 14 ** copyright notice and this permission notice appear in supporting | |
| 15 ** documentation. This software is provided "as is" without express or | |
| 16 ** implied warranty. | |
| 17 ** | |
| 18 ** Changelog: | |
| 19 ** 1.0 -- first release; supports SunAudio, Wave and RAW file formats | |
| 20 ** detects (and rejects) VOC file format | |
| 21 ** tested with PC-Speaker driver only | |
| 22 ** 1.1 -- fixed bug with playback of stereo Wave files | |
| 23 ** fixed VOC file detection | |
| 24 ** fixed mono/8bit conversion | |
| 25 ** cleaned up mixer programming (c.f. VoxWare-SDK) | |
| 26 ** tested with PC-Speaker driver and with PAS16 soundcard | |
| 27 ** 1.2 -- first (incompatible) attempt at fixing reliable signal handling | |
| 28 ** 1.3 -- changed signal handling to use reliable signals; this is done | |
| 29 ** by including "syssignal.h"; it fixes nasty program crashes | |
| 30 ** when using native sound in TTY mode. | |
| 31 ** added support for DEC audio file format (this is basically the | |
| 32 ** same as Sun audio, but uses little endian format, instead). | |
| 33 ** strip the header from Sun audio and DEC audio files in order to | |
| 34 ** prevent noise at beginning of samples (thanks to Thomas Pundt | |
| 35 ** <pundtt@math.uni-muenster.de> for pointing out this bug and | |
| 36 ** providing information on the file format). | |
| 37 ** added a few more conversion routines. | |
| 38 ** made the code even more tolerant to the limits imposed by some | |
| 39 ** soundcards and try to accept soundfiles even if they are not | |
| 40 ** fully conformant to the standard. | |
| 41 ** 1.4 -- increased header size to 256; I hope there is no sample software | |
| 42 ** that requires this much. | |
| 43 ** added code for converting from signed to unsigned format as | |
| 44 ** some soundcards cannot handle signed 8bit data. | |
| 45 */ | |
| 46 | |
| 47 /* Synched up with: Not in FSF. */ | |
| 48 | |
| 563 | 49 /* This file Mule-ized by Ben Wing, 5-15-01. */ |
| 50 | |
| 428 | 51 /* XEmacs beta testers say: undef this by default. */ |
| 52 #undef NOVOLUMECTRLFORMULAW /* Changing the volume for uLaw-encoded | |
| 53 samples sounds very poor; possibly, | |
| 54 this is true only for the PC-Snd | |
| 55 driver, so undefine this symbol at your | |
| 56 discretion */ | |
| 57 | |
| 58 #include <config.h> | |
| 563 | 59 #include "lisp.h" |
| 428 | 60 |
| 61 #include "miscplay.h" | |
| 563 | 62 #include "sound.h" |
| 428 | 63 |
| 64 #include "syssignal.h" | |
| 65 #include "sysfile.h" | |
| 563 | 66 #include "systty.h" /* for sys/ioctl.h */ |
| 67 #include SOUNDCARD_H_FILE /* Path computed by configure */ | |
| 428 | 68 |
| 442 | 69 static SIGTYPE (*sighup_handler) (int); |
| 70 static SIGTYPE (*sigint_handler) (int); | |
| 428 | 71 |
| 72 static int mix_fd; | |
| 73 static int audio_vol; | |
| 74 static int audio_fd; | |
| 2367 | 75 static Ascbyte *audio_dev = "/dev/dsp"; |
| 428 | 76 |
| 77 /* Intercept SIGINT and SIGHUP in order to close the audio and mixer | |
| 78 devices before terminating sound output; this requires reliable | |
| 79 signals as provided by "syssignal.h" */ | |
| 442 | 80 static SIGTYPE |
| 81 sighandler (int sig) | |
| 428 | 82 { |
| 83 if (mix_fd > 0) { | |
| 84 if (audio_vol >= 0) { | |
| 85 ioctl(mix_fd,SOUND_MIXER_WRITE_PCM,&audio_vol); | |
| 86 audio_vol = -1; } | |
| 87 if (mix_fd != audio_fd) | |
| 88 close(mix_fd); | |
| 89 mix_fd = -1; } | |
| 90 if (audio_fd > 0) { | |
| 91 ioctl(audio_fd,SNDCTL_DSP_SYNC,NULL); | |
| 92 ioctl(audio_fd,SNDCTL_DSP_RESET,NULL); | |
| 93 close(audio_fd); | |
| 94 audio_fd = -1; } | |
| 95 if (sig == SIGHUP && sighup_handler) sighup_handler(sig); | |
| 96 else if (sig == SIGINT && sigint_handler) sigint_handler(sig); | |
| 97 else exit(1); | |
| 98 } | |
| 99 | |
| 100 /* Initialize the soundcard and mixer device with the parameters that we | |
| 101 found in the header of the sound file. If the soundcard is not capable of | |
| 102 natively supporting the required parameters, then try to set up conversion | |
| 103 routines. | |
| 104 The difficulty with setting up the sound card is that the parameters are | |
| 105 not fully orthogonal; changing one of them might affect some of the | |
| 106 others, too. Thus we do quite a lot of double checking; actually most of | |
| 107 this is not needed right now, but it will come in handy, if the kernel's | |
| 108 sounddriver ever changes or if third-party sounddrivers are used. */ | |
| 563 | 109 static int |
| 110 audio_init(int mixx_fd, int auddio_fd, int fmt, int speed, | |
| 111 int tracks, int *volume, | |
| 112 size_t (**sndcnv) (void **, size_t *sz, void **)) | |
| 428 | 113 { |
| 114 int i,the_speed,the_stereo,the_fmt; | |
| 115 | |
| 116 *sndcnv = sndcnvnop; | |
| 117 | |
| 118 if (ioctl(auddio_fd,SNDCTL_DSP_SYNC,NULL) < 0) { | |
| 563 | 119 sound_perror("SNDCTL_DSP_SYNC"); |
| 428 | 120 return(0); } |
| 121 | |
| 122 /* Initialize sound hardware with preferred parameters */ | |
| 123 | |
| 124 /* If the sound hardware cannot support 16 bit format or requires a | |
| 125 different byte sex then try to drop to 8 bit format */ | |
| 126 | |
| 127 the_fmt = fmt; | |
| 128 if(ioctl(audio_fd,SNDCTL_DSP_SETFMT,&the_fmt) < 0) { | |
| 563 | 129 sound_perror("SNDCTL_DSP_SETFMT"); |
| 428 | 130 return(0); |
| 131 } | |
| 132 | |
| 133 if (fmt != the_fmt) { | |
| 134 if (fmt == AFMT_S16_LE || fmt == AFMT_S16_BE) { | |
| 135 *sndcnv = fmt == AFMT_S16_BE ? sndcnv2byteBE : sndcnv2byteLE; | |
| 136 if (((i=fmt=AFMT_U8),ioctl(audio_fd,SNDCTL_DSP_SETFMT,&i)) < 0 || | |
| 137 fmt != i || ioctl(audio_fd,SNDCTL_DSP_SETFMT,&the_fmt) < 0 || | |
| 138 fmt != the_fmt) { | |
| 563 | 139 sound_perror("SNDCTL_DSP_SETFMT"); |
| 428 | 140 return(0); } } |
| 141 else if (fmt == AFMT_MU_LAW && the_fmt == AFMT_U8 ) { | |
| 142 /* the kernel will convert for us */ } | |
| 143 else { | |
| 563 | 144 sound_perror("SNDCTL_DSP_SETFMT"); |
| 428 | 145 return(0); } } |
| 146 else if (fmt == AFMT_S8) { | |
| 147 *sndcnv = sndcnv2unsigned; | |
| 148 if (((i=fmt=AFMT_U8),ioctl(audio_fd,SNDCTL_DSP_SETFMT,&i)) < 0 || | |
| 149 fmt != i || ioctl(audio_fd,SNDCTL_DSP_SETFMT,&the_fmt) < 0 || | |
| 150 fmt != the_fmt) { | |
| 563 | 151 sound_perror("SNDCTRL_DSP_SETFMT"); |
| 428 | 152 return(0); } } |
| 153 | |
| 154 /* The PCSP driver does not support reading of the sampling rate via the | |
| 155 SOUND_PCM_READ_RATE ioctl; determine "the_speed" here */ | |
| 156 the_speed = speed; ioctl(audio_fd,SNDCTL_DSP_SPEED,&the_speed); | |
| 157 /* The PCSP driver does not support reading of the mono/stereo flag, thus | |
| 158 we assume, that failure to change this mode means we are in mono mode */ | |
| 159 if (((i = (the_stereo = tracks)-1),ioctl(audio_fd,SNDCTL_DSP_STEREO,&i)) < 0) | |
| 160 the_stereo = 1; | |
| 161 | |
| 162 /* Try to request stereo playback (if needed); if this cannot be supported | |
| 163 by the hardware, then install conversion routines for mono playback */ | |
| 164 | |
| 165 /* This ioctl will fail if we use the PCSP driver; thus the value of | |
| 166 "the_stereo" is still unchanged */ | |
| 167 ioctl(audio_fd,SOUND_PCM_READ_CHANNELS,&the_stereo); | |
| 168 if (tracks != the_stereo) { | |
| 169 if (tracks == 2) { | |
| 170 tracks = 1; | |
| 171 *sndcnv = *sndcnv == sndcnv2byteLE ? sndcnv2monobyteLE : | |
| 172 *sndcnv == sndcnv2byteBE ? sndcnv2monobyteBE : | |
| 173 *sndcnv == sndcnv2unsigned ? sndcnv2monounsigned : | |
| 174 the_fmt == AFMT_S16_LE ? sndcnv16_2monoLE : | |
| 175 the_fmt == AFMT_S16_BE ? sndcnv16_2monoBE : | |
| 176 the_fmt == AFMT_S8 ? sndcnv8S_2mono : | |
| 177 the_fmt == AFMT_U8 ? sndcnv8U_2mono : | |
| 178 the_fmt == AFMT_MU_LAW ? sndcnvULaw_2mono : NULL; | |
| 179 if (*sndcnv == NULL) { /* this should not happen */ | |
| 563 | 180 sound_perror("SNDCTL_DSP_STEREO"); |
| 428 | 181 return(0); } |
| 182 /* Switch to mono mode */ | |
| 183 if (((i = 0),ioctl(audio_fd,SNDCTL_DSP_STEREO,&i)) < 0 || i) { | |
| 563 | 184 sound_perror("SNDCTL_DSP_STEREO"); |
| 428 | 185 return(0); } |
| 186 /* Now double check that everything is set as expected */ | |
| 187 if (((i = AFMT_QUERY),ioctl(audio_fd,SNDCTL_DSP_SETFMT,&i)) < 0 || | |
| 188 (i != the_fmt && | |
| 189 (((i=the_fmt),ioctl(audio_fd,SNDCTL_DSP_SETFMT,&i)) < 0 || | |
| 190 i != the_fmt || | |
| 191 ((i = AFMT_QUERY),ioctl(audio_fd,SNDCTL_DSP_SETFMT,&i)) < 0 || | |
| 192 i != the_fmt)) || | |
| 193 (ioctl(audio_fd,SOUND_PCM_READ_CHANNELS,&i) >= 0 && | |
| 194 i != 1)) { | |
| 195 /* There was no way that we could set the soundcard to a meaningful | |
| 196 mode */ | |
| 563 | 197 sound_perror("SNDCTL_DSP_SETFMT and SNDCTL_DSP_STEREO"); |
| 428 | 198 return(0); } } |
| 199 else { | |
| 200 /* Somebody set the soundcard to stereo even though we requested | |
| 201 mono; this should not happen... */ | |
| 202 if (((i = the_stereo = tracks),ioctl(audio_fd,SNDCTL_DSP_STEREO,&i))<0 || | |
| 203 i != the_stereo-1) { | |
| 563 | 204 sound_perror("SNDCTL_DSP_STEREO"); |
| 428 | 205 return(0); } |
| 206 if (((i = AFMT_QUERY),ioctl(audio_fd,SNDCTL_DSP_SETFMT,&i)) < 0 || | |
| 207 i != the_fmt) { | |
| 563 | 208 sound_perror("SNDCTL_DSP_SETFMT"); |
| 428 | 209 return(0); } } } |
| 210 | |
| 211 /* Fail if deviations from desired sampling frequency are too big */ | |
| 212 | |
| 213 /* This ioctl will fail if we use the PCSP driver; thus the value of | |
| 214 "the_speed" is still unchanged */ | |
| 215 ioctl(audio_fd,SOUND_PCM_READ_RATE,&the_speed); | |
| 216 if (speed*14 < the_speed*10 || speed*6 > the_speed*10) { | |
| 563 | 217 Extbyte buffer[256]; |
| 428 | 218 sprintf(buffer,"SNDCTL_DSP_SPEED (req: %d, rtn: %d)",speed,the_speed); |
| 563 | 219 sound_perror(buffer); |
| 428 | 220 return(0); } |
| 221 | |
| 222 /* Use the mixer device for setting the playback volume */ | |
| 223 if (mixx_fd > 0) { | |
| 224 int vol = *volume & 0xFF; | |
| 225 if (ioctl(mixx_fd,SOUND_MIXER_READ_PCM,volume) < 0) | |
| 226 *volume = -1; | |
| 227 if (vol < 0) vol = 0; else if (vol > 100) vol = 100; | |
| 228 #ifdef NOVOLUMECTRLFORMULAW | |
| 229 if (fmt == AFMT_MU_LAW) | |
| 230 vol = 100; | |
| 231 #endif | |
| 232 vol |= 256*vol; | |
| 233 /* Do not signal an error, if volume control is unavailable! */ | |
| 234 ioctl(mixx_fd,SOUND_MIXER_WRITE_PCM,&vol); } | |
| 235 | |
| 236 #if defined(LINUXPLAYSTANDALONE) && 1 | |
| 237 /* Debugging output is displayed only when compiled as stand-alone version */ | |
| 238 {int the_volume; | |
| 239 the_fmt = AFMT_QUERY; | |
| 240 ioctl(audio_fd,SNDCTL_DSP_SETFMT,&the_fmt); | |
| 241 ioctl(auddio_fd,SOUND_PCM_READ_CHANNELS,&the_stereo); | |
| 242 ioctl(auddio_fd,SOUND_PCM_READ_RATE,&the_speed); | |
| 243 ioctl(mixx_fd,SOUND_MIXER_READ_PCM,&the_volume); | |
| 244 fprintf(stderr,"%s, %s, %dHz, L:%d/R:%d\n", | |
| 245 the_fmt == AFMT_MU_LAW ? "AFMT_MU_LAW" : | |
| 246 the_fmt == AFMT_A_LAW ? "AFMT_A_LAW" : | |
| 247 the_fmt == AFMT_IMA_ADPCM ? "AFMT_IMA_ADPCM" : | |
| 248 the_fmt == AFMT_U8 ? "AFMT_U8" : | |
| 249 the_fmt == AFMT_S16_LE ? "AFMT_S16_LE" : | |
| 250 the_fmt == AFMT_S16_BE ? "AFMT_S16_BE" : | |
| 251 the_fmt == AFMT_S8 ? "AFMT_S8" : | |
| 252 the_fmt == AFMT_U16_LE ? "AFMT_U16_LE" : | |
| 253 the_fmt == AFMT_U16_BE ? "AFMT_U16_BE" : | |
| 254 the_fmt == AFMT_MPEG ? "AFMT_MPEG" : | |
| 255 "AFMT_???", | |
| 256 the_stereo == 2 ? "stereo" : "mono", | |
| 257 the_speed, | |
| 258 the_volume / 256, the_volume % 256); } | |
| 259 #endif | |
| 260 | |
| 261 return(1); | |
| 262 } | |
| 263 | |
| 264 /* XEmacs requires code both for playback of pre-loaded data and for playback | |
| 442 | 265 from a soundfile; we use one function for both cases. |
| 266 | |
| 267 Returns 1 on succes. 0 otherwise. | |
| 268 */ | |
| 563 | 269 static int |
| 2367 | 270 linux_play_data_or_file(int fd, Binbyte *data, |
| 563 | 271 int length, int volume) |
| 428 | 272 { |
| 273 size_t (*parsesndfile)(void **dayta,size_t *sz,void **outbuf); | |
| 274 size_t (*sndcnv)(void **dayta,size_t *sz,void **); | |
| 275 fmtType ffmt; | |
| 276 int fmt,speed,tracks; | |
| 2271 | 277 void *pptr, *optr, *cptr, *sptr; |
| 4030 | 278 int wrtn, crtn; |
| 279 size_t prtn, rrtn; | |
| 280 Binbyte sndbuf[SNDBUFSZ]; | |
| 428 | 281 |
| 282 /* We need to read at least the header information before we can start | |
| 283 doing anything */ | |
| 284 if (!data || length < HEADERSZ) { | |
| 442 | 285 if (fd < 0) return 0; |
| 428 | 286 else { |
| 647 | 287 length = read (fd,sndbuf,SNDBUFSZ); |
| 428 | 288 if (length < HEADERSZ) |
| 442 | 289 return 0; |
| 428 | 290 data = sndbuf; |
| 291 length = SNDBUFSZ; } | |
| 292 } | |
| 293 | |
| 294 ffmt = analyze_format(data,&fmt,&speed,&tracks,&parsesndfile); | |
| 295 | |
| 296 if (ffmt != fmtRaw && ffmt != fmtSunAudio && ffmt != fmtWave) { | |
| 563 | 297 sound_warn("Unsupported file format (neither RAW, nor Sun/DECAudio, nor WAVE)"); |
| 442 | 298 return 0; } |
| 428 | 299 |
| 300 /* The VoxWare-SDK discourages opening /dev/audio; opening /dev/dsp and | |
| 301 properly initializing it via ioctl() is preferred */ | |
| 302 if ((audio_fd=open(audio_dev, O_WRONLY | O_NONBLOCK, 0)) < 0) { | |
| 442 | 303 /* JV. Much too verbose. In addition this can crash. See NOTE: in |
| 304 Fplay_sound | |
| 563 | 305 sound_perror(audio_dev); */ |
| 428 | 306 if (mix_fd > 0 && mix_fd != audio_fd) { close(mix_fd); mix_fd = -1; } |
| 442 | 307 return 0; } |
| 428 | 308 |
| 309 /* The VoxWare-SDK discourages direct manipulation of the mixer device as | |
| 310 this could lead to problems, when multiple sound cards are installed */ | |
| 311 mix_fd = audio_fd; | |
| 312 | |
| 613 | 313 sighup_handler = EMACS_SIGNAL (SIGHUP, sighandler); |
| 314 sigint_handler = EMACS_SIGNAL (SIGINT, sighandler); | |
| 428 | 315 |
| 316 if (!audio_init(mix_fd,audio_fd,fmt,speed,tracks,&volume,&sndcnv)) | |
| 317 goto END_OF_PLAY; | |
| 318 audio_vol = volume; | |
| 319 | |
| 320 reset_parsestate(); | |
| 321 | |
| 322 /* Mainloop: read a block of data, parse its contents, perform all | |
| 323 the necessary conversions and output it to the sound | |
| 324 device; repeat until all data has been processed */ | |
| 325 rrtn = length; | |
| 326 do { | |
| 3963 | 327 for (pptr = data; (prtn = parsesndfile(&pptr,&rrtn,&optr)) > 0; ) |
| 328 for (cptr = optr; (crtn = sndcnv(&cptr,&prtn,&sptr)) > 0; ) { | |
| 428 | 329 for (;;) { |
| 330 if ((wrtn = write(audio_fd,sptr,crtn)) < 0) { | |
| 563 | 331 sound_perror("write"); goto END_OF_PLAY; } |
| 428 | 332 else if (wrtn) break; |
| 333 else if (ioctl(audio_fd,SNDCTL_DSP_SYNC,NULL) < 0) { | |
| 563 | 334 sound_perror("SNDCTL_DSP_SYNC"); goto END_OF_PLAY; } } |
| 428 | 335 if (wrtn != crtn) { |
| 563 | 336 Extbyte buf[255]; |
| 428 | 337 sprintf(buf,"play: crtn = %d, wrtn = %d",crtn,wrtn); |
| 563 | 338 sound_warn(buf); |
| 428 | 339 goto END_OF_PLAY; } } |
| 340 if (fd >= 0) { | |
| 341 if ((rrtn = read(fd,sndbuf,SNDBUFSZ)) < 0) { | |
| 563 | 342 sound_perror("read"); goto END_OF_PLAY; } } |
| 428 | 343 else |
| 344 break; | |
| 345 } while (rrtn > 0); | |
| 346 | |
| 347 if (ffmt == fmtWave) | |
| 348 parse_wave_complete(); | |
| 442 | 349 |
| 428 | 350 |
| 351 END_OF_PLAY: | |
| 352 /* Now cleanup all used resources */ | |
| 353 | |
| 354 ioctl(audio_fd,SNDCTL_DSP_SYNC,NULL); | |
| 355 ioctl(audio_fd,SNDCTL_DSP_RESET,NULL); | |
| 356 | |
| 613 | 357 EMACS_SIGNAL (SIGHUP,sighup_handler); |
| 358 EMACS_SIGNAL (SIGINT,sigint_handler); | |
| 428 | 359 |
| 360 if (mix_fd > 0) { | |
| 361 if (audio_vol >= 0) { | |
| 362 ioctl(mix_fd,SOUND_MIXER_WRITE_PCM,&audio_vol); | |
| 363 audio_vol = -1; } | |
| 364 if (mix_fd != audio_fd) | |
| 365 close(mix_fd); | |
| 366 mix_fd = -1; } | |
| 367 | |
| 368 close(audio_fd); | |
| 369 audio_fd = -1; | |
| 370 | |
| 442 | 371 return 1; |
| 428 | 372 } |
| 373 | |
| 374 /* Call "linux_play_data_or_file" with the appropriate parameters for | |
| 375 playing a soundfile */ | |
| 563 | 376 void |
| 377 play_sound_file (Extbyte *sound_file, int volume) | |
| 428 | 378 { |
| 379 int fd; | |
| 380 | |
| 381 if ((fd=open(sound_file,O_RDONLY,0)) < 0) { | |
| 563 | 382 sound_perror(sound_file); |
| 428 | 383 return; } |
| 384 linux_play_data_or_file(fd,NULL,0,volume); | |
| 385 close(fd); | |
| 386 return; | |
| 387 } | |
| 388 | |
| 389 /* Call "linux_play_data_or_file" with the appropriate parameters for | |
| 390 playing pre-loaded data */ | |
| 563 | 391 int |
| 2367 | 392 play_sound_data (Binbyte *data, int length, int volume) |
| 428 | 393 { |
| 442 | 394 return linux_play_data_or_file(-1,data,length,volume); |
| 428 | 395 } |
