About Kernel Documentation Linux Kernel Contact Linux Resources Linux Blog

Documentation / sound / oss / MultiSound


Based on kernel version 4.13.3. Page generated on 2017-09-23 13:56 EST.

1	#! /bin/sh
2	#
3	#  Turtle Beach MultiSound Driver Notes
4	#  -- Andrew Veliath <andrewtv@usa.net>
5	#
6	#  Last update:                      September 10, 1998
7	#  Corresponding msnd driver:        0.8.3
8	#
9	# ** This file is a README (top part) and shell archive (bottom part).
10	#    The corresponding archived utility sources can be unpacked by
11	#    running `sh MultiSound' (the utilities are only needed for the
12	#    Pinnacle and Fiji cards). **
13	#
14	#
15	#  -=-=- Getting Firmware -=-=-
16	#  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
17	#  
18	#  See the section `Obtaining and Creating Firmware Files' in this
19	#  document for instructions on obtaining the necessary firmware
20	#  files.
21	#  
22	#  
23	#  Supported Features
24	#  ~~~~~~~~~~~~~~~~~~
25	#  
26	#  Currently, full-duplex digital audio (/dev/dsp only, /dev/audio is
27	#  not currently available) and mixer functionality (/dev/mixer) are
28	#  supported (memory mapped digital audio is not yet supported).
29	#  Digital transfers and monitoring can be done as well if you have
30	#  the digital daughterboard (see the section on using the S/PDIF port
31	#  for more information).
32	#
33	#  Support for the Turtle Beach MultiSound Hurricane architecture is
34	#  composed of the following modules (these can also operate compiled
35	#  into the kernel):
36	#  
37	#  msnd               - MultiSound base (requires soundcore)
38	#
39	#  msnd_classic       - Base audio/mixer support for Classic, Monetery and
40	#                       Tahiti cards
41	#
42	#  msnd_pinnacle      - Base audio/mixer support for Pinnacle and Fiji cards
43	#  
44	#  
45	#  Important Notes - Read Before Using
46	#  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
47	#  
48	#  The firmware files are not included (may change in future).  You
49	#  must obtain these images from Turtle Beach (they are included in
50	#  the MultiSound Development Kits), and place them in /etc/sound for
51	#  example, and give the full paths in the Linux configuration.  If
52	#  you are compiling in support for the MultiSound driver rather than
53	#  using it as a module, these firmware files must be accessible
54	#  during kernel compilation.
55	#
56	#  Please note these files must be binary files, not assembler.  See
57	#  the section later in this document for instructions to obtain these
58	#  files.
59	#  
60	#  
61	#  Configuring Card Resources
62	#  ~~~~~~~~~~~~~~~~~~~~~~~~~~
63	#
64	#  ** This section is very important, as your card may not work at all
65	#     or your machine may crash if you do not do this correctly. **
66	#
67	#  * Classic/Monterey/Tahiti
68	#  
69	#  These cards are configured through the driver msnd_classic.  You must
70	#  know the io port, then the driver will select the irq and memory resources
71	#  on the card.  It is up to you to know if these are free locations or now,
72	#  a conflict can lock the machine up.
73	#
74	#  * Pinnacle/Fiji
75	#
76	#  The Pinnacle and Fiji cards have an extra config port, either
77	#  0x250, 0x260 or 0x270.  This port can be disabled to have the card
78	#  configured strictly through PnP, however you lose the ability to
79	#  access the IDE controller and joystick devices on this card when
80	#  using PnP.  The included pinnaclecfg program in this shell archive
81	#  can be used to configure the card in non-PnP mode, and in PnP mode
82	#  you can use isapnptools.  These are described briefly here.
83	#
84	#  pinnaclecfg is not required; you can use the msnd_pinnacle module
85	#  to fully configure the card as well.  However, pinnaclecfg can be
86	#  used to change the resource values of a particular device after the
87	#  msnd_pinnacle module has been loaded.  If you are compiling the
88	#  driver into the kernel, you must set these values during compile
89	#  time, however other peripheral resource values can be changed with
90	#  the pinnaclecfg program after the kernel is loaded.
91	#
92	#
93	#  *** PnP mode
94	#  
95	#  Use pnpdump to obtain a sample configuration if you can; I was able
96	#  to obtain one with the command `pnpdump 1 0x203' -- this may vary
97	#  for you (running pnpdump by itself did not work for me).  Then,
98	#  edit this file and use isapnp to uncomment and set the card values.
99	#  Use these values when inserting the msnd_pinnacle module.  Using
100	#  this method, you can set the resources for the DSP and the Kurzweil
101	#  synth (Pinnacle).  Since Linux does not directly support PnP
102	#  devices, you may have difficulty when using the card in PnP mode
103	#  when it the driver is compiled into the kernel.  Using non-PnP mode
104	#  is preferable in this case.
105	#
106	#  Here is an example mypinnacle.conf for isapnp that sets the card to
107	#  io base 0x210, irq 5 and mem 0xd8000, and also sets the Kurzweil
108	#  synth to 0x330 and irq 9 (may need editing for your system):
109	#
110	#  (READPORT 0x0203)
111	#  (CSN 2)
112	#  (IDENTIFY *)
113	#  
114	#  # DSP
115	#  (CONFIGURE BVJ0440/-1 (LD 0
116	#          (INT 0 (IRQ 5 (MODE +E))) (IO 0 (BASE 0x0210)) (MEM 0 (BASE 0x0d8000))
117	#          (ACT Y)))
118	#  
119	#  # Kurzweil Synth (Pinnacle Only)
120	#  (CONFIGURE BVJ0440/-1 (LD 1
121	#          (IO 0 (BASE 0x0330)) (INT 0 (IRQ 9 (MODE +E)))
122	#          (ACT Y)))
123	#  
124	#  (WAITFORKEY)
125	#
126	#
127	#  *** Non-PnP mode
128	#  
129	#  The second way is by running the card in non-PnP mode.  This
130	#  actually has some advantages in that you can access some other
131	#  devices on the card, such as the joystick and IDE controller.  To
132	#  configure the card, unpack this shell archive and build the
133	#  pinnaclecfg program.  Using this program, you can assign the
134	#  resource values to the card's devices, or disable the devices.  As
135	#  an alternative to using pinnaclecfg, you can specify many of the
136	#  configuration values when loading the msnd_pinnacle module (or
137	#  during kernel configuration when compiling the driver into the
138	#  kernel).
139	#
140	#  If you specify cfg=0x250 for the msnd_pinnacle module, it
141	#  automatically configure the card to the given io, irq and memory
142	#  values using that config port (the config port is jumper selectable
143	#  on the card to 0x250, 0x260 or 0x270).
144	#
145	#  See the `msnd_pinnacle Additional Options' section below for more
146	#  information on these parameters (also, if you compile the driver
147	#  directly into the kernel, these extra parameters can be useful
148	#  here).
149	#
150	#
151	# ** It is very easy to cause problems in your machine if you choose a
152	#    resource value which is incorrect. **
153	#  
154	#
155	#  Examples
156	#  ~~~~~~~~
157	#  
158	#  * MultiSound Classic/Monterey/Tahiti:
159	#  
160	#  modprobe soundcore
161	#  insmod msnd
162	#  insmod msnd_classic io=0x290 irq=7 mem=0xd0000
163	#  
164	#  * MultiSound Pinnacle in PnP mode:
165	#  
166	#  modprobe soundcore
167	#  insmod msnd
168	#  isapnp mypinnacle.conf
169	#  insmod msnd_pinnacle io=0x210 irq=5 mem=0xd8000 <-- match mypinnacle.conf values
170	#  
171	#  * MultiSound Pinnacle in non-PnP mode (replace 0x250 with your configuration port,
172	#    one of 0x250, 0x260 or 0x270):
173	#  
174	#  insmod soundcore
175	#  insmod msnd
176	#  insmod msnd_pinnacle cfg=0x250 io=0x290 irq=5 mem=0xd0000
177	#  
178	# * To use the MPU-compatible Kurzweil synth on the Pinnacle in PnP
179	#   mode, add the following (assumes you did `isapnp mypinnacle.conf'):
180	#  
181	#  insmod sound
182	#  insmod mpu401 io=0x330 irq=9                    <-- match mypinnacle.conf values
183	#  
184	# * To use the MPU-compatible Kurzweil synth on the Pinnacle in non-PnP
185	#   mode, add the following.  Note how we first configure the peripheral's
186	#   resources, _then_ install a Linux driver for it:
187	#  
188	#  insmod sound
189	#  pinnaclecfg 0x250 mpu 0x330 9
190	#  insmod mpu401 io=0x330 irq=9
191	#
192	#  -- OR you can use the following sequence without pinnaclecfg in non-PnP mode:
193	#
194	#  insmod soundcore
195	#  insmod msnd
196	#  insmod msnd_pinnacle cfg=0x250 io=0x290 irq=5 mem=0xd0000 mpu_io=0x330 mpu_irq=9
197	#  insmod sound
198	#  insmod mpu401 io=0x330 irq=9
199	#
200	# * To setup the joystick port on the Pinnacle in non-PnP mode (though
201	#   you have to find the actual Linux joystick driver elsewhere), you
202	#   can use pinnaclecfg:
203	#
204	#   pinnaclecfg 0x250 joystick 0x200
205	#
206	#  -- OR you can configure this using msnd_pinnacle with the following:
207	#
208	#  insmod soundcore
209	#  insmod msnd
210	#  insmod msnd_pinnacle cfg=0x250 io=0x290 irq=5 mem=0xd0000 joystick_io=0x200
211	#
212	#  
213	#  msnd_classic, msnd_pinnacle Required Options
214	#  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
215	#  
216	#  If the following options are not given, the module will not load.
217	#  Examine the kernel message log for informative error messages.
218	#  WARNING--probing isn't supported so try to make sure you have the
219	#  correct shared memory area, otherwise you may experience problems.
220	#  
221	#  io                   I/O base of DSP, e.g. io=0x210
222	#  irq                  IRQ number, e.g. irq=5
223	#  mem                  Shared memory area, e.g. mem=0xd8000
224	#  
225	#  
226	#  msnd_classic, msnd_pinnacle Additional Options
227	#  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
228	#  
229	#  fifosize             The digital audio FIFOs, in kilobytes.  If not
230	#                       specified, the default will be used.  Increasing
231	#                       this value will reduce the chance of a FIFO
232	#                       underflow at the expense of increasing overall
233	#                       latency.  For example, fifosize=512 will
234	#                       allocate 512kB read and write FIFOs (1MB total).
235	#                       While this may reduce dropouts, a heavy machine
236	#                       load will undoubtedly starve the FIFO of data
237	#                       and you will eventually get dropouts.  One
238	#                       option is to alter the scheduling priority of
239	#                       the playback process, using `nice' or some form
240	#                       of POSIX soft real-time scheduling.
241	#
242	#  calibrate_signal     Setting this to one calibrates the ADCs to the
243	#                       signal, zero calibrates to the card (defaults
244	#                       to zero).
245	#  
246	#  
247	#  msnd_pinnacle Additional Options
248	#  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
249	#
250	#  digital              Specify digital=1 to enable the S/PDIF input
251	#                       if you have the digital daughterboard
252	#                       adapter. This will enable access to the
253	#                       DIGITAL1 input for the soundcard in the mixer.
254	#                       Some mixer programs might have trouble setting
255	#                       the DIGITAL1 source as an input.  If you have
256	#                       trouble, you can try the setdigital.c program
257	#                       at the bottom of this document.
258	#
259	#  cfg                  Non-PnP configuration port for the Pinnacle
260	#                       and Fiji (typically 0x250, 0x260 or 0x270,
261	#                       depending on the jumper configuration).  If
262	#                       this option is omitted, then it is assumed
263	#                       that the card is in PnP mode, and that the
264	#                       specified DSP resource values are already
265	#                       configured with PnP (i.e. it won't attempt to
266	#                       do any sort of configuration).
267	#
268	#  When the Pinnacle is in non-PnP mode, you can use the following
269	#  options to configure particular devices.  If a full specification
270	#  for a device is not given, then the device is not configured.  Note
271	#  that you still must use a Linux driver for any of these devices
272	#  once their resources are setup (such as the Linux joystick driver,
273	#  or the MPU401 driver from OSS for the Kurzweil synth).
274	#
275	#  mpu_io               I/O port of MPU (on-board Kurzweil synth)
276	#  mpu_irq              IRQ of MPU (on-board Kurzweil synth)
277	#  ide_io0		First I/O port of IDE controller
278	#  ide_io1		Second I/O port of IDE controller
279	#  ide_irq		IRQ IDE controller
280	#  joystick_io          I/O port of joystick
281	#  
282	#  
283	#  Obtaining and Creating Firmware Files
284	#  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
285	#  
286	#       For the Classic/Tahiti/Monterey
287	#       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
288	#  
289	#  Download to /tmp and unzip the following file from Turtle Beach:
290	#  
291	#       ftp://ftp.voyetra.com/pub/tbs/msndcl/msndvkit.zip
292	#  
293	#  When unzipped, unzip the file named MsndFiles.zip.  Then copy the
294	#  following firmware files to /etc/sound (note the file renaming):
295	#  
296	#    cp DSPCODE/MSNDINIT.BIN /etc/sound/msndinit.bin
297	#    cp DSPCODE/MSNDPERM.REB /etc/sound/msndperm.bin
298	#  
299	#  When configuring the Linux kernel, specify /etc/sound/msndinit.bin and
300	#  /etc/sound/msndperm.bin for the two firmware files (Linux kernel
301	#  versions older than 2.2 do not ask for firmware paths, and are
302	#  hardcoded to /etc/sound).
303	#
304	#  If you are compiling the driver into the kernel, these files must
305	#  be accessible during compilation, but will not be needed later.
306	#  The files must remain, however, if the driver is used as a module.
307	#  
308	#  
309	#       For the Pinnacle/Fiji
310	#       ~~~~~~~~~~~~~~~~~~~~~
311	#  
312	#  Download to /tmp and unzip the following file from Turtle Beach (be
313	#  sure to use the entire URL; some have had trouble navigating to the
314	#  URL):
315	#  
316	#       ftp://ftp.voyetra.com/pub/tbs/pinn/pnddk100.zip
317	#
318	#  Unpack this shell archive, and run make in the created directory
319	#  (you need a C compiler and flex to build the utilities).  This
320	#  should give you the executables conv, pinnaclecfg and setdigital.
321	#  conv is only used temporarily here to create the firmware files,
322	#  while pinnaclecfg is used to configure the Pinnacle or Fiji card in
323	#  non-PnP mode, and setdigital can be used to set the S/PDIF input on
324	#  the mixer (pinnaclecfg and setdigital should be copied to a
325	#  convenient place, possibly run during system initialization).
326	#
327	#  To generating the firmware files with the `conv' program, we create
328	#  the binary firmware files by doing the following conversion
329	#  (assuming the archive unpacked into a directory named PINNDDK):
330	#  
331	#    ./conv < PINNDDK/dspcode/pndspini.asm > /etc/sound/pndspini.bin
332	#    ./conv < PINNDDK/dspcode/pndsperm.asm > /etc/sound/pndsperm.bin
333	#  
334	#  The conv (and conv.l) program is not needed after conversion and can
335	#  be safely deleted.  Then, when configuring the Linux kernel, specify
336	#  /etc/sound/pndspini.bin and /etc/sound/pndsperm.bin for the two
337	#  firmware files (Linux kernel versions older than 2.2 do not ask for
338	#  firmware paths, and are hardcoded to /etc/sound).
339	#  
340	#  If you are compiling the driver into the kernel, these files must
341	#  be accessible during compilation, but will not be needed later.
342	#  The files must remain, however, if the driver is used as a module.
343	#
344	#  
345	#  Using Digital I/O with the S/PDIF Port
346	#  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
347	#
348	#  If you have a Pinnacle or Fiji with the digital daughterboard and
349	#  want to set it as the input source, you can use this program if you
350	#  have trouble trying to do it with a mixer program (be sure to
351	#  insert the module with the digital=1 option, or say Y to the option
352	#  during compiled-in kernel operation).  Upon selection of the S/PDIF
353	#  port, you should be able monitor and record from it.
354	#
355	#  There is something to note about using the S/PDIF port.  Digital
356	#  timing is taken from the digital signal, so if a signal is not
357	#  connected to the port and it is selected as recording input, you
358	#  will find PCM playback to be distorted in playback rate.  Also,
359	#  attempting to record at a sampling rate other than the DAT rate may
360	#  be problematic (i.e. trying to record at 8000Hz when the DAT signal
361	#  is 44100Hz).  If you have a problem with this, set the recording
362	#  input to analog if you need to record at a rate other than that of
363	#  the DAT rate.
364	#
365	#
366	#  -- Shell archive attached below, just run `sh MultiSound' to extract.
367	#     Contains Pinnacle/Fiji utilities to convert firmware, configure
368	#     in non-PnP mode, and select the DIGITAL1 input for the mixer.
369	#
370	#
371	#!/bin/sh
372	# This is a shell archive (produced by GNU sharutils 4.2).
373	# To extract the files from this archive, save it to some FILE, remove
374	# everything before the `!/bin/sh' line above, then type `sh FILE'.
375	#
376	# Made on 1998-12-04 10:07 EST by <andrewtv@ztransform.velsoft.com>.
377	# Source directory was `/home/andrewtv/programming/pinnacle/pinnacle'.
378	#
379	# Existing files will *not* be overwritten unless `-c' is specified.
380	#
381	# This shar contains:
382	# length mode       name
383	# ------ ---------- ------------------------------------------
384	#   2046 -rw-rw-r-- MultiSound.d/setdigital.c
385	#  10235 -rw-rw-r-- MultiSound.d/pinnaclecfg.c
386	#    106 -rw-rw-r-- MultiSound.d/Makefile
387	#    141 -rw-rw-r-- MultiSound.d/conv.l
388	#   1472 -rw-rw-r-- MultiSound.d/msndreset.c
389	#
390	save_IFS="${IFS}"
391	IFS="${IFS}:"
392	gettext_dir=FAILED
393	locale_dir=FAILED
394	first_param="$1"
395	for dir in $PATH
396	do
397	  if test "$gettext_dir" = FAILED && test -f $dir/gettext \
398	     && ($dir/gettext --version >/dev/null 2>&1)
399	  then
400	    set `$dir/gettext --version 2>&1`
401	    if test "$3" = GNU
402	    then
403	      gettext_dir=$dir
404	    fi
405	  fi
406	  if test "$locale_dir" = FAILED && test -f $dir/shar \
407	     && ($dir/shar --print-text-domain-dir >/dev/null 2>&1)
408	  then
409	    locale_dir=`$dir/shar --print-text-domain-dir`
410	  fi
411	done
412	IFS="$save_IFS"
413	if test "$locale_dir" = FAILED || test "$gettext_dir" = FAILED
414	then
415	  echo=echo
416	else
417	  TEXTDOMAINDIR=$locale_dir
418	  export TEXTDOMAINDIR
419	  TEXTDOMAIN=sharutils
420	  export TEXTDOMAIN
421	  echo="$gettext_dir/gettext -s"
422	fi
423	touch -am 1231235999 $$.touch >/dev/null 2>&1
424	if test ! -f 1231235999 && test -f $$.touch; then
425	  shar_touch=touch
426	else
427	  shar_touch=:
428	  echo
429	  $echo 'WARNING: not restoring timestamps.  Consider getting and'
430	  $echo "installing GNU \`touch', distributed in GNU File Utilities..."
431	  echo
432	fi
433	rm -f 1231235999 $$.touch
434	#
435	if mkdir _sh01426; then
436	  $echo 'x -' 'creating lock directory'
437	else
438	  $echo 'failed to create lock directory'
439	  exit 1
440	fi
441	# ============= MultiSound.d/setdigital.c ==============
442	if test ! -d 'MultiSound.d'; then
443	  $echo 'x -' 'creating directory' 'MultiSound.d'
444	  mkdir 'MultiSound.d'
445	fi
446	if test -f 'MultiSound.d/setdigital.c' && test "$first_param" != -c; then
447	  $echo 'x -' SKIPPING 'MultiSound.d/setdigital.c' '(file already exists)'
448	else
449	  $echo 'x -' extracting 'MultiSound.d/setdigital.c' '(text)'
450	  sed 's/^X//' << 'SHAR_EOF' > 'MultiSound.d/setdigital.c' &&
451	/*********************************************************************
452	X *
453	X * setdigital.c - sets the DIGITAL1 input for a mixer
454	X *
455	X * Copyright (C) 1998 Andrew Veliath
456	X *
457	X * This program is free software; you can redistribute it and/or modify
458	X * it under the terms of the GNU General Public License as published by
459	X * the Free Software Foundation; either version 2 of the License, or
460	X * (at your option) any later version.
461	X *
462	X * This program is distributed in the hope that it will be useful,
463	X * but WITHOUT ANY WARRANTY; without even the implied warranty of
464	X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
465	X * GNU General Public License for more details.
466	X *
467	X * You should have received a copy of the GNU General Public License
468	X * along with this program; if not, write to the Free Software
469	X * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
470	X *
471	X ********************************************************************/
472	X
473	#include <stdio.h>
474	#include <unistd.h>
475	#include <fcntl.h>
476	#include <sys/types.h>
477	#include <sys/stat.h>
478	#include <sys/ioctl.h>
479	#include <sys/soundcard.h>
480	X
481	int main(int argc, char *argv[])
482	{
483	X	int fd;
484	X	unsigned long recmask, recsrc;
485	X
486	X	if (argc != 2) {
487	X		fprintf(stderr, "usage: setdigital <mixer device>\n");
488	X		exit(1);
489	X	}
490	X
491	X	if ((fd = open(argv[1], O_RDWR)) < 0) {
492	X		perror(argv[1]);
493	X		exit(1);
494	X	}
495	X
496	X	if (ioctl(fd, SOUND_MIXER_READ_RECMASK, &recmask) < 0) {
497	X		fprintf(stderr, "error: ioctl read recording mask failed\n");
498	X		perror("ioctl");
499	X		close(fd);
500	X		exit(1);
501	X	}
502	X
503	X	if (!(recmask & SOUND_MASK_DIGITAL1)) {
504	X		fprintf(stderr, "error: cannot find DIGITAL1 device in mixer\n");
505	X		close(fd);
506	X		exit(1);
507	X	}
508	X
509	X	if (ioctl(fd, SOUND_MIXER_READ_RECSRC, &recsrc) < 0) {
510	X		fprintf(stderr, "error: ioctl read recording source failed\n");
511	X		perror("ioctl");
512	X		close(fd);
513	X		exit(1);
514	X	}
515	X
516	X	recsrc |= SOUND_MASK_DIGITAL1;
517	X	
518	X	if (ioctl(fd, SOUND_MIXER_WRITE_RECSRC, &recsrc) < 0) {
519	X		fprintf(stderr, "error: ioctl write recording source failed\n");
520	X		perror("ioctl");
521	X		close(fd);
522	X		exit(1);
523	X	}
524	X
525	X	close(fd);
526	X	
527	X	return 0;
528	}
529	SHAR_EOF
530	  $shar_touch -am 1204092598 'MultiSound.d/setdigital.c' &&
531	  chmod 0664 'MultiSound.d/setdigital.c' ||
532	  $echo 'restore of' 'MultiSound.d/setdigital.c' 'failed'
533	  if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
534	  && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
535	    md5sum -c << SHAR_EOF >/dev/null 2>&1 \
536	    || $echo 'MultiSound.d/setdigital.c:' 'MD5 check failed'
537	e87217fc3e71288102ba41fd81f71ec4  MultiSound.d/setdigital.c
538	SHAR_EOF
539	  else
540	    shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'MultiSound.d/setdigital.c'`"
541	    test 2046 -eq "$shar_count" ||
542	    $echo 'MultiSound.d/setdigital.c:' 'original size' '2046,' 'current size' "$shar_count!"
543	  fi
544	fi
545	# ============= MultiSound.d/pinnaclecfg.c ==============
546	if test -f 'MultiSound.d/pinnaclecfg.c' && test "$first_param" != -c; then
547	  $echo 'x -' SKIPPING 'MultiSound.d/pinnaclecfg.c' '(file already exists)'
548	else
549	  $echo 'x -' extracting 'MultiSound.d/pinnaclecfg.c' '(text)'
550	  sed 's/^X//' << 'SHAR_EOF' > 'MultiSound.d/pinnaclecfg.c' &&
551	/*********************************************************************
552	X *
553	X * pinnaclecfg.c - Pinnacle/Fiji Device Configuration Program
554	X *
555	X * This is for NON-PnP mode only.  For PnP mode, use isapnptools.
556	X *
557	X * This is Linux-specific, and must be run with root permissions.
558	X *
559	X * Part of the Turtle Beach MultiSound Sound Card Driver for Linux
560	X *
561	X * Copyright (C) 1998 Andrew Veliath
562	X *
563	X * This program is free software; you can redistribute it and/or modify
564	X * it under the terms of the GNU General Public License as published by
565	X * the Free Software Foundation; either version 2 of the License, or
566	X * (at your option) any later version.
567	X *
568	X * This program is distributed in the hope that it will be useful,
569	X * but WITHOUT ANY WARRANTY; without even the implied warranty of
570	X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
571	X * GNU General Public License for more details.
572	X *
573	X * You should have received a copy of the GNU General Public License
574	X * along with this program; if not, write to the Free Software
575	X * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
576	X *
577	X ********************************************************************/
578	X
579	#include <stdio.h>
580	#include <stdlib.h>
581	#include <string.h>
582	#include <errno.h>
583	#include <unistd.h>
584	#include <asm/io.h>
585	#include <asm/types.h>
586	X
587	#define IREG_LOGDEVICE		0x07
588	#define IREG_ACTIVATE		0x30
589	#define LD_ACTIVATE		0x01
590	#define LD_DISACTIVATE		0x00
591	#define IREG_EECONTROL		0x3F
592	#define IREG_MEMBASEHI		0x40
593	#define IREG_MEMBASELO		0x41
594	#define IREG_MEMCONTROL		0x42
595	#define IREG_MEMRANGEHI		0x43
596	#define IREG_MEMRANGELO		0x44
597	#define MEMTYPE_8BIT		0x00
598	#define MEMTYPE_16BIT		0x02
599	#define MEMTYPE_RANGE		0x00
600	#define MEMTYPE_HIADDR		0x01
601	#define IREG_IO0_BASEHI		0x60
602	#define IREG_IO0_BASELO		0x61
603	#define IREG_IO1_BASEHI		0x62
604	#define IREG_IO1_BASELO		0x63
605	#define IREG_IRQ_NUMBER		0x70
606	#define IREG_IRQ_TYPE		0x71
607	#define IRQTYPE_HIGH		0x02
608	#define IRQTYPE_LOW		0x00
609	#define IRQTYPE_LEVEL		0x01
610	#define IRQTYPE_EDGE		0x00
611	X
612	#define HIBYTE(w)		((BYTE)(((WORD)(w) >> 8) & 0xFF))
613	#define LOBYTE(w)		((BYTE)(w))
614	#define MAKEWORD(low,hi)	((WORD)(((BYTE)(low))|(((WORD)((BYTE)(hi)))<<8)))
615	X
616	typedef __u8			BYTE;
617	typedef __u16			USHORT;
618	typedef __u16			WORD;
619	X
620	static int config_port = -1;
621	X
622	static int msnd_write_cfg(int cfg, int reg, int value)
623	{
624	X	outb(reg, cfg);
625	X	outb(value, cfg + 1);
626	X	if (value != inb(cfg + 1)) {
627	X		fprintf(stderr, "error: msnd_write_cfg: I/O error\n");
628	X		return -EIO;
629	X	}
630	X	return 0;
631	}
632	X
633	static int msnd_read_cfg(int cfg, int reg)
634	{
635	X	outb(reg, cfg);
636	X	return inb(cfg + 1);
637	}
638	X
639	static int msnd_write_cfg_io0(int cfg, int num, WORD io)
640	{
641	X	if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num))
642	X		return -EIO;
643	X	if (msnd_write_cfg(cfg, IREG_IO0_BASEHI, HIBYTE(io)))
644	X		return -EIO;
645	X	if (msnd_write_cfg(cfg, IREG_IO0_BASELO, LOBYTE(io)))
646	X		return -EIO;
647	X	return 0;
648	}
649	X
650	static int msnd_read_cfg_io0(int cfg, int num, WORD *io)
651	{
652	X	if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num))
653	X		return -EIO;
654	X	
655	X	*io = MAKEWORD(msnd_read_cfg(cfg, IREG_IO0_BASELO),
656	X		       msnd_read_cfg(cfg, IREG_IO0_BASEHI));
657	X
658	X	return 0;
659	}
660	X
661	static int msnd_write_cfg_io1(int cfg, int num, WORD io)
662	{
663	X	if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num))
664	X		return -EIO;
665	X	if (msnd_write_cfg(cfg, IREG_IO1_BASEHI, HIBYTE(io)))
666	X		return -EIO;
667	X	if (msnd_write_cfg(cfg, IREG_IO1_BASELO, LOBYTE(io)))
668	X		return -EIO;
669	X	return 0;
670	}
671	X
672	static int msnd_read_cfg_io1(int cfg, int num, WORD *io)
673	{
674	X	if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num))
675	X		return -EIO;
676	X	
677	X	*io = MAKEWORD(msnd_read_cfg(cfg, IREG_IO1_BASELO),
678	X		       msnd_read_cfg(cfg, IREG_IO1_BASEHI));
679	X
680	X	return 0;
681	}
682	X
683	static int msnd_write_cfg_irq(int cfg, int num, WORD irq)
684	{
685	X	if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num))
686	X		return -EIO;
687	X	if (msnd_write_cfg(cfg, IREG_IRQ_NUMBER, LOBYTE(irq)))
688	X		return -EIO;
689	X	if (msnd_write_cfg(cfg, IREG_IRQ_TYPE, IRQTYPE_EDGE))
690	X		return -EIO;
691	X	return 0;
692	}
693	X
694	static int msnd_read_cfg_irq(int cfg, int num, WORD *irq)
695	{
696	X	if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num))
697	X		return -EIO;
698	X	
699	X	*irq = msnd_read_cfg(cfg, IREG_IRQ_NUMBER);
700	X
701	X	return 0;
702	}
703	X
704	static int msnd_write_cfg_mem(int cfg, int num, int mem)
705	{
706	X	WORD wmem;
707	X
708	X	mem >>= 8;
709	X	mem &= 0xfff;
710	X	wmem = (WORD)mem;
711	X	if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num))
712	X		return -EIO;
713	X	if (msnd_write_cfg(cfg, IREG_MEMBASEHI, HIBYTE(wmem)))
714	X		return -EIO;
715	X	if (msnd_write_cfg(cfg, IREG_MEMBASELO, LOBYTE(wmem)))
716	X		return -EIO;
717	X	if (wmem && msnd_write_cfg(cfg, IREG_MEMCONTROL, (MEMTYPE_HIADDR | MEMTYPE_16BIT)))
718	X		return -EIO;
719	X	return 0;
720	}
721	X
722	static int msnd_read_cfg_mem(int cfg, int num, int *mem)
723	{
724	X	if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num))
725	X		return -EIO;
726	X	
727	X	*mem = MAKEWORD(msnd_read_cfg(cfg, IREG_MEMBASELO),
728	X			msnd_read_cfg(cfg, IREG_MEMBASEHI));
729	X	*mem <<= 8;
730	X
731	X	return 0;
732	}
733	X
734	static int msnd_activate_logical(int cfg, int num)
735	{
736	X	if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num))
737	X		return -EIO;
738	X	if (msnd_write_cfg(cfg, IREG_ACTIVATE, LD_ACTIVATE))
739	X		return -EIO;
740	X	return 0;
741	}
742	X
743	static int msnd_write_cfg_logical(int cfg, int num, WORD io0, WORD io1, WORD irq, int mem)
744	{
745	X	if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num))
746	X		return -EIO;
747	X	if (msnd_write_cfg_io0(cfg, num, io0))
748	X		return -EIO;
749	X	if (msnd_write_cfg_io1(cfg, num, io1))
750	X		return -EIO;
751	X	if (msnd_write_cfg_irq(cfg, num, irq))
752	X		return -EIO;
753	X	if (msnd_write_cfg_mem(cfg, num, mem))
754	X		return -EIO;
755	X	if (msnd_activate_logical(cfg, num))
756	X		return -EIO;
757	X	return 0;
758	}
759	X
760	static int msnd_read_cfg_logical(int cfg, int num, WORD *io0, WORD *io1, WORD *irq, int *mem)
761	{
762	X	if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num))
763	X		return -EIO;
764	X	if (msnd_read_cfg_io0(cfg, num, io0))
765	X		return -EIO;
766	X	if (msnd_read_cfg_io1(cfg, num, io1))
767	X		return -EIO;
768	X	if (msnd_read_cfg_irq(cfg, num, irq))
769	X		return -EIO;
770	X	if (msnd_read_cfg_mem(cfg, num, mem))
771	X		return -EIO;
772	X	return 0;
773	}
774	X
775	static void usage(void)
776	{
777	X	fprintf(stderr,
778	X		"\n"
779	X		"pinnaclecfg 1.0\n"
780	X		"\n"
781	X		"usage: pinnaclecfg <config port> [device config]\n"
782	X		"\n"
783	X		"This is for use with the card in NON-PnP mode only.\n"
784	X		"\n"
785	X		"Available devices (not all available for Fiji):\n"
786	X		"\n"
787	X		"        Device                       Description\n"
788	X		"        -------------------------------------------------------------------\n"
789	X		"        reset                        Reset all devices (i.e. disable)\n"
790	X		"        show                         Display current device configurations\n"
791	X		"\n"
792	X		"        dsp <io> <irq> <mem>         Audio device\n"
793	X		"        mpu <io> <irq>               Internal Kurzweil synth\n"
794	X		"        ide <io0> <io1> <irq>        On-board IDE controller\n"
795	X		"        joystick <io>                Joystick port\n"
796	X		"\n");
797	X	exit(1);
798	}
799	X
800	static int cfg_reset(void)
801	{
802	X	int i;
803	X
804	X	for (i = 0; i < 4; ++i)
805	X		msnd_write_cfg_logical(config_port, i, 0, 0, 0, 0);
806	X	
807	X	return 0;
808	}
809	X
810	static int cfg_show(void)
811	{
812	X	int i;
813	X	int count = 0;
814	X
815	X	for (i = 0; i < 4; ++i) {
816	X		WORD io0, io1, irq;
817	X		int mem;
818	X		msnd_read_cfg_logical(config_port, i, &io0, &io1, &irq, &mem);
819	X		switch (i) {
820	X		case 0:
821	X			if (io0 || irq || mem) {
822	X				printf("dsp 0x%x %d 0x%x\n", io0, irq, mem);
823	X				++count;
824	X			}
825	X			break;
826	X		case 1:
827	X			if (io0 || irq) {
828	X				printf("mpu 0x%x %d\n", io0, irq);
829	X				++count;
830	X			}
831	X			break;
832	X		case 2:
833	X			if (io0 || io1 || irq) {
834	X				printf("ide 0x%x 0x%x %d\n", io0, io1, irq);
835	X				++count;
836	X			}
837	X			break;
838	X		case 3:
839	X			if (io0) {
840	X				printf("joystick 0x%x\n", io0);
841	X				++count;
842	X			}
843	X			break;
844	X		}
845	X	}
846	X
847	X	if (count == 0)
848	X		fprintf(stderr, "no devices configured\n");
849	X	
850	X	return 0;
851	}
852	X
853	static int cfg_dsp(int argc, char *argv[])
854	{
855	X	int io, irq, mem;
856	X
857	X	if (argc < 3 ||
858	X	    sscanf(argv[0], "0x%x", &io) != 1 ||
859	X	    sscanf(argv[1], "%d", &irq) != 1 ||
860	X	    sscanf(argv[2], "0x%x", &mem) != 1)
861	X		usage();
862	X
863	X	if (!(io == 0x290 ||
864	X	      io == 0x260 ||
865	X	      io == 0x250 ||
866	X	      io == 0x240 ||
867	X	      io == 0x230 ||
868	X	      io == 0x220 ||
869	X	      io == 0x210 ||
870	X	      io == 0x3e0)) {
871	X		fprintf(stderr, "error: io must be one of "
872	X			"210, 220, 230, 240, 250, 260, 290, or 3E0\n");
873	X		usage();
874	X	}
875	X	
876	X	if (!(irq == 5 ||
877	X	      irq == 7 ||
878	X	      irq == 9 ||
879	X	      irq == 10 ||
880	X	      irq == 11 ||
881	X	      irq == 12)) {
882	X		fprintf(stderr, "error: irq must be one of "
883	X			"5, 7, 9, 10, 11 or 12\n");
884	X		usage();
885	X	}
886	X
887	X	if (!(mem == 0xb0000 ||
888	X	      mem == 0xc8000 ||
889	X	      mem == 0xd0000 ||
890	X	      mem == 0xd8000 ||
891	X	      mem == 0xe0000 ||
892	X	      mem == 0xe8000)) {
893	X		fprintf(stderr, "error: mem must be one of "
894	X			"0xb0000, 0xc8000, 0xd0000, 0xd8000, 0xe0000 or 0xe8000\n");
895	X		usage();
896	X	}
897	X
898	X	return msnd_write_cfg_logical(config_port, 0, io, 0, irq, mem);
899	}
900	X
901	static int cfg_mpu(int argc, char *argv[])
902	{
903	X	int io, irq;
904	X
905	X	if (argc < 2 ||
906	X	    sscanf(argv[0], "0x%x", &io) != 1 ||
907	X	    sscanf(argv[1], "%d", &irq) != 1)
908	X		usage();
909	X	
910	X	return msnd_write_cfg_logical(config_port, 1, io, 0, irq, 0);
911	}
912	X
913	static int cfg_ide(int argc, char *argv[])
914	{
915	X	int io0, io1, irq;
916	X
917	X	if (argc < 3 ||
918	X	    sscanf(argv[0], "0x%x", &io0) != 1 ||
919	X	    sscanf(argv[0], "0x%x", &io1) != 1 ||
920	X	    sscanf(argv[1], "%d", &irq) != 1)
921	X		usage();
922	X	
923	X	return msnd_write_cfg_logical(config_port, 2, io0, io1, irq, 0);
924	}
925	X
926	static int cfg_joystick(int argc, char *argv[])
927	{
928	X	int io;
929	X
930	X	if (argc < 1 ||
931	X	    sscanf(argv[0], "0x%x", &io) != 1)
932	X		usage();
933	X	
934	X	return msnd_write_cfg_logical(config_port, 3, io, 0, 0, 0);
935	}
936	X
937	int main(int argc, char *argv[])
938	{
939	X	char *device;
940	X	int rv = 0;
941	X
942	X	--argc; ++argv;
943	X
944	X	if (argc < 2)
945	X		usage();
946	X
947	X	sscanf(argv[0], "0x%x", &config_port);
948	X	if (config_port != 0x250 && config_port != 0x260 && config_port != 0x270) {
949	X		fprintf(stderr, "error: <config port> must be 0x250, 0x260 or 0x270\n");
950	X		exit(1);
951	X	}
952	X	if (ioperm(config_port, 2, 1)) {
953	X		perror("ioperm");
954	X		fprintf(stderr, "note: pinnaclecfg must be run as root\n");
955	X		exit(1);
956	X	}
957	X	device = argv[1];
958	X
959	X	argc -= 2; argv += 2;
960	X
961	X	if (strcmp(device, "reset") == 0)
962	X		rv = cfg_reset();
963	X	else if (strcmp(device, "show") == 0)
964	X		rv = cfg_show();
965	X	else if (strcmp(device, "dsp") == 0)
966	X		rv = cfg_dsp(argc, argv);
967	X	else if (strcmp(device, "mpu") == 0)
968	X		rv = cfg_mpu(argc, argv);
969	X	else if (strcmp(device, "ide") == 0)
970	X		rv = cfg_ide(argc, argv);
971	X	else if (strcmp(device, "joystick") == 0)
972	X		rv = cfg_joystick(argc, argv);
973	X	else {
974	X		fprintf(stderr, "error: unknown device %s\n", device);
975	X		usage();
976	X	}
977	X
978	X	if (rv)
979	X		fprintf(stderr, "error: device configuration failed\n");
980	X	
981	X	return 0;
982	}
983	SHAR_EOF
984	  $shar_touch -am 1204092598 'MultiSound.d/pinnaclecfg.c' &&
985	  chmod 0664 'MultiSound.d/pinnaclecfg.c' ||
986	  $echo 'restore of' 'MultiSound.d/pinnaclecfg.c' 'failed'
987	  if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
988	  && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
989	    md5sum -c << SHAR_EOF >/dev/null 2>&1 \
990	    || $echo 'MultiSound.d/pinnaclecfg.c:' 'MD5 check failed'
991	366bdf27f0db767a3c7921d0a6db20fe  MultiSound.d/pinnaclecfg.c
992	SHAR_EOF
993	  else
994	    shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'MultiSound.d/pinnaclecfg.c'`"
995	    test 10235 -eq "$shar_count" ||
996	    $echo 'MultiSound.d/pinnaclecfg.c:' 'original size' '10235,' 'current size' "$shar_count!"
997	  fi
998	fi
999	# ============= MultiSound.d/Makefile ==============
1000	if test -f 'MultiSound.d/Makefile' && test "$first_param" != -c; then
1001	  $echo 'x -' SKIPPING 'MultiSound.d/Makefile' '(file already exists)'
1002	else
1003	  $echo 'x -' extracting 'MultiSound.d/Makefile' '(text)'
1004	  sed 's/^X//' << 'SHAR_EOF' > 'MultiSound.d/Makefile' &&
1005	CC	= gcc
1006	CFLAGS	= -O
1007	PROGS	= setdigital msndreset pinnaclecfg conv
1008	X
1009	all: $(PROGS)
1010	X
1011	clean:
1012	X	rm -f $(PROGS)
1013	SHAR_EOF
1014	  $shar_touch -am 1204092398 'MultiSound.d/Makefile' &&
1015	  chmod 0664 'MultiSound.d/Makefile' ||
1016	  $echo 'restore of' 'MultiSound.d/Makefile' 'failed'
1017	  if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
1018	  && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
1019	    md5sum -c << SHAR_EOF >/dev/null 2>&1 \
1020	    || $echo 'MultiSound.d/Makefile:' 'MD5 check failed'
1021	76ca8bb44e3882edcf79c97df6c81845  MultiSound.d/Makefile
1022	SHAR_EOF
1023	  else
1024	    shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'MultiSound.d/Makefile'`"
1025	    test 106 -eq "$shar_count" ||
1026	    $echo 'MultiSound.d/Makefile:' 'original size' '106,' 'current size' "$shar_count!"
1027	  fi
1028	fi
1029	# ============= MultiSound.d/conv.l ==============
1030	if test -f 'MultiSound.d/conv.l' && test "$first_param" != -c; then
1031	  $echo 'x -' SKIPPING 'MultiSound.d/conv.l' '(file already exists)'
1032	else
1033	  $echo 'x -' extracting 'MultiSound.d/conv.l' '(text)'
1034	  sed 's/^X//' << 'SHAR_EOF' > 'MultiSound.d/conv.l' &&
1035	%%
1036	[ \n\t,\r]
1037	\;.*
1038	DB
1039	[0-9A-Fa-f]+H	{ int n; sscanf(yytext, "%xH", &n); printf("%c", n); }
1040	%%
1041	int yywrap() { return 1; }
1042	main() { yylex(); }
1043	SHAR_EOF
1044	  $shar_touch -am 0828231798 'MultiSound.d/conv.l' &&
1045	  chmod 0664 'MultiSound.d/conv.l' ||
1046	  $echo 'restore of' 'MultiSound.d/conv.l' 'failed'
1047	  if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
1048	  && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
1049	    md5sum -c << SHAR_EOF >/dev/null 2>&1 \
1050	    || $echo 'MultiSound.d/conv.l:' 'MD5 check failed'
1051	d2411fc32cd71a00dcdc1f009e858dd2  MultiSound.d/conv.l
1052	SHAR_EOF
1053	  else
1054	    shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'MultiSound.d/conv.l'`"
1055	    test 141 -eq "$shar_count" ||
1056	    $echo 'MultiSound.d/conv.l:' 'original size' '141,' 'current size' "$shar_count!"
1057	  fi
1058	fi
1059	# ============= MultiSound.d/msndreset.c ==============
1060	if test -f 'MultiSound.d/msndreset.c' && test "$first_param" != -c; then
1061	  $echo 'x -' SKIPPING 'MultiSound.d/msndreset.c' '(file already exists)'
1062	else
1063	  $echo 'x -' extracting 'MultiSound.d/msndreset.c' '(text)'
1064	  sed 's/^X//' << 'SHAR_EOF' > 'MultiSound.d/msndreset.c' &&
1065	/*********************************************************************
1066	X *
1067	X * msndreset.c - resets the MultiSound card
1068	X *
1069	X * Copyright (C) 1998 Andrew Veliath
1070	X *
1071	X * This program is free software; you can redistribute it and/or modify
1072	X * it under the terms of the GNU General Public License as published by
1073	X * the Free Software Foundation; either version 2 of the License, or
1074	X * (at your option) any later version.
1075	X *
1076	X * This program is distributed in the hope that it will be useful,
1077	X * but WITHOUT ANY WARRANTY; without even the implied warranty of
1078	X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1079	X * GNU General Public License for more details.
1080	X *
1081	X * You should have received a copy of the GNU General Public License
1082	X * along with this program; if not, write to the Free Software
1083	X * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
1084	X *
1085	X ********************************************************************/
1086	X
1087	#include <stdio.h>
1088	#include <unistd.h>
1089	#include <fcntl.h>
1090	#include <sys/types.h>
1091	#include <sys/stat.h>
1092	#include <sys/ioctl.h>
1093	#include <sys/soundcard.h>
1094	X
1095	int main(int argc, char *argv[])
1096	{
1097	X	int fd;
1098	X
1099	X	if (argc != 2) {
1100	X		fprintf(stderr, "usage: msndreset <mixer device>\n");
1101	X		exit(1);
1102	X	}
1103	X
1104	X	if ((fd = open(argv[1], O_RDWR)) < 0) {
1105	X		perror(argv[1]);
1106	X		exit(1);
1107	X	}
1108	X
1109	X	if (ioctl(fd, SOUND_MIXER_PRIVATE1, 0) < 0) {
1110	X		fprintf(stderr, "error: msnd ioctl reset failed\n");
1111	X		perror("ioctl");
1112	X		close(fd);
1113	X		exit(1);
1114	X	}
1115	X
1116	X	close(fd);
1117	X	
1118	X	return 0;
1119	}
1120	SHAR_EOF
1121	  $shar_touch -am 1204100698 'MultiSound.d/msndreset.c' &&
1122	  chmod 0664 'MultiSound.d/msndreset.c' ||
1123	  $echo 'restore of' 'MultiSound.d/msndreset.c' 'failed'
1124	  if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
1125	  && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
1126	    md5sum -c << SHAR_EOF >/dev/null 2>&1 \
1127	    || $echo 'MultiSound.d/msndreset.c:' 'MD5 check failed'
1128	c52f876521084e8eb25e12e01dcccb8a  MultiSound.d/msndreset.c
1129	SHAR_EOF
1130	  else
1131	    shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'MultiSound.d/msndreset.c'`"
1132	    test 1472 -eq "$shar_count" ||
1133	    $echo 'MultiSound.d/msndreset.c:' 'original size' '1472,' 'current size' "$shar_count!"
1134	  fi
1135	fi
1136	rm -fr _sh01426
1137	exit 0
Hide Line Numbers


About Kernel Documentation Linux Kernel Contact Linux Resources Linux Blog