amiga-request@abcfd20.larc.nasa.gov (Amiga Sources/Binaries Moderator) (10/11/90)
Submitted-by: "Tim Friest - Programmer/Analyst" <AXTBF%ALASKA.BITNET@CORNELLC.cit.cornell.edu>
Posting-number: Volume 90, Issue 277
Archive-name: util/macto8svx-1.0/part01
This is a little program I wrote to convert Mac sound samples to Amiga
IFF 8SVX format... It uses 2.0 stuff, so you'll need 2.0 to compile it.
#!/bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of archive 1 (of 1)."
# Contents: Macto8SVX.c Macto8SVX.doc
# Wrapped by tadguy@abcfd20 on Wed Oct 10 21:06:09 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Macto8SVX.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'Macto8SVX.c'\"
else
echo shar: Extracting \"'Macto8SVX.c'\" \(9075 characters\)
sed "s/^X//" >'Macto8SVX.c' <<'END_OF_FILE'
X/*
X * Read a Mac sound file and convert it to an IFF 8SVX sound file
X *
X * by: Tim Friest
X * on: 6-August-1990
X */
X
X#include <exec/types.h>
X#include <clib/exec_protos.h>
X#include <pragma/exec_pragma.h>
X#include <exec/memory.h>
X#include <dos/dos.h>
X#include <dos/rdargs.h>
X#include <clib/dos_protos.h>
X#include <pragma/dos_pragma.h>
X#include <libraries/iffparse.h>
X#include <clib/iffparse_protos.h>
X#include <pragma/iffparse_pragma.h>
X#include <iff/iff.h>
X#include <iff/8SVX.h>
X
Xextern struct library *DOSBase;
X
Xchar *version = "\0$VER: MacTo8SVX 1.0 (8-Aug-90)";
X#define CREDITS "MacTo8SVX v1.0 (8-Aug-90) by Tim Friest (PD)\n"
X
X#define ARG_TEMPLATE "MacSound/A,IFF8SVX/A,Rate=SampleRate/K/N"
X
X#define OPT_FILENAME 0
X#define OPT_IFFNAME 1
X#define OPT_RATE 2
X
X#define OPT_COUNT 3
Xchar *cmd_opts[OPT_COUNT];
X
Xstruct RDArgs *argsptr;
X
Xextern void SignalIFFError(int);
Xextern void main(void);
Xvoid main() {
X int status;
X ULONG AllocFlags = 0;
X struct FileInfoBlock *fib;
X BPTR file, flock;
X struct library *IFFParseBase;
X struct IFFHandle *IFFHandle;
X char *filename, *iffname;
X int SampleRate;
X Voice8Header VHDR;
X UBYTE *SoundData;
X LONG SoundLen, i;
X
X if ((IFFParseBase = OpenLibrary("iffparse.library", 0)) == NULL) {
X Write(Output(), "Unable to open IFFParse Library\n", 32);
X goto CleanUp;
X }
X AllocFlags |= (1<<0);
X
X if ((argsptr = ReadArgs(ARG_TEMPLATE, (LONG *)cmd_opts, NULL)) == NULL)
X{
X Write(Output(), "Usage: ", 7);
X Write(Output(), ARG_TEMPLATE, sizeof(ARG_TEMPLATE));
X Write(Output(), "\n", 1);
X Write(Output(), CREDITS, sizeof(CREDITS));
X goto CleanUp;
X }
X AllocFlags |= (1<<10);
X
X filename = cmd_opts[OPT_FILENAME];
X iffname = cmd_opts[OPT_IFFNAME];
X if (cmd_opts[OPT_RATE])
X SampleRate = *(int *)cmd_opts[OPT_RATE];
X else
X SampleRate = 11;
X
X if ((file = Open(filename, MODE_OLDFILE)) == NULL) {
X Write(Output(), "Error opening file\n", 19);
X goto CleanUp;
X }
X AllocFlags |= (1<<11);
X
X if ((flock = Lock(filename, MODE_OLDFILE)) == NULL) {
X Write(Output(), "Error locking file\n", 19);
X goto CleanUp;
X }
X AllocFlags |= (1<<12);
X
X if ((fib = (struct FileInfoBlock *)AllocMem(sizeof(struct FileInfoBlock)
X, MEMF_CLEAR)) == NULL) {
X Write(Output(), "Not enough memory for file info block\n", 28);
X goto CleanUp;
X }
X AllocFlags |= (1<<13);
X
X if (!Examine(flock, fib)) {
X Write(Output(), "Examine failed!\n", 16);
X goto CleanUp;
X }
X SoundLen = fib->fib_Size;
X
X FreeMem((char *)fib, sizeof(struct FileInfoBlock));
X AllocFlags &= ~(1<<13);
X
X UnLock(flock);
X AllocFlags &= ~(1<<12);
X
X if ((SoundData = AllocMem(SoundLen, MEMF_CLEAR)) == NULL) {
X Write(Output(), "Not enough memory\n", 18);
X goto CleanUp;
X }
X AllocFlags |= (1<<14);
X
X if (Read(file, SoundData, SoundLen) < SoundLen) {
X Write(Output(), "Error reading file\n", 19);
X goto CleanUp;
X }
X Close(file);
X AllocFlags &= ~(1<<11);
X
X for (i=0; i < SoundLen; i++)
X SoundData[i] ^= 0x80; /* toggle high bit */
X
X VHDR.oneShotHiSamples = SoundLen;
X VHDR.repeatHiSamples = 0;
X VHDR.samplesPerHiCycle = 0;
X switch (SampleRate) {
X case 5:
X VHDR.samplesPerSec = 5696; /* 5.564 * 1024 */
X break;
X case 7:
X VHDR.samplesPerSec = 7596; /* 7.418 * 1024 */
X break;
X case 11:
X VHDR.samplesPerSec = 11395; /* 11.128 * 1024 */
X break;
X case 22:
X VHDR.samplesPerSec = 22790; /* 22.256 * 1024 */
X break;
X default:
X Write(Output(), "Sample rate one of 5, 7, 11 and 22, usi
Xng 11\n", 45);
X VHDR.samplesPerSec = 11395;
X } /* switch */
X VHDR.ctOctave = 1;
X VHDR.sCompression = sCmpNone;
X VHDR.volume = Unity;
X
X if ((IFFHandle = AllocIFF()) == NULL) {
X Write(Output(), "Not enough memory to allocate IFF Handle\n", 41
X);
X goto CleanUp;
X }
X AllocFlags |= (1<<1);
X if ((IFFHandle->iff_Stream = (ULONG)Open(iffname, MODE_NEWFILE)) == NULL
X) {
X Write(Output(), "Error opening file\n", 19);
X goto CleanUp;
X }
X AllocFlags |= (1<<2);
X InitIFFasDOS(IFFHandle);
X
X if ((status = OpenIFF(IFFHandle, IFFF_WRITE)) != 0) {
X SignalIFFError(status);
X goto CleanUp;
X }
X AllocFlags |= (1<<3);
X
X if ((status = PushChunk(IFFHandle, ID_8SVX, ID_FORM, IFFSIZE_UNKNOWN)) !
X= 0) {
X SignalIFFError(status);
X goto CleanUp;
X }
X
X if ((status = PushChunk(IFFHandle, ID_8SVX, ID_VHDR, sizeof(Voice8Header
X))) != 0) {
X SignalIFFError(status);
X goto CleanUp;
X }
X if ((status = WriteChunkBytes(IFFHandle, &VHDR, sizeof(Voice8Header))) <
X= 0) {
X SignalIFFError(status);
X goto CleanUp;
X }
X if ((status = PopChunk(IFFHandle)) != 0) { /* pop the 8SVX VHDR chunk */
X SignalIFFError(status);
X goto CleanUp;
X }
X
X if ((status = PushChunk(IFFHandle, ID_8SVX, ID_BODY, SoundLen)) != 0) {
X SignalIFFError(status);
X goto CleanUp;
X }
X if ((status = WriteChunkBytes(IFFHandle, SoundData, SoundLen)) <= 0) {
X SignalIFFError(status);
X goto CleanUp;
X }
X if ((status = PopChunk(IFFHandle)) != 0) { /* pop the 8SVX BODY chunk */
X SignalIFFError(status);
X goto CleanUp;
X }
X
X if ((status = PopChunk(IFFHandle)) != 0) { /* pop the FORM 8SVX chunk */
X SignalIFFError(status);
X goto CleanUp;
X }
X
X
X/*
X * Deallocate and close all resources used
X */
XCleanUp:
X if (AllocFlags & (1<<14))
X FreeMem(SoundData, SoundLen);
X if (AllocFlags & (1<<13))
X FreeMem((char *)fib, sizeof(struct FileInfoBlock));
X if (AllocFlags & (1<<12))
X Close(file);
X if (AllocFlags & (1<<11))
X UnLock(flock);
X if (AllocFlags & (1<<10))
X FreeArgs(argsptr);
X if (AllocFlags & (1<<3))
X CloseIFF(IFFHandle);
X if (AllocFlags & (1<<2))
X Close(IFFHandle->iff_Stream);
X if (AllocFlags & (1<<1))
X FreeIFF(IFFHandle);
X if (AllocFlags & (1<<0))
X CloseLibrary(IFFParseBase);
X}
X
X/*
X * Signal IFF error codes to user
X */
Xvoid SignalIFFError(error)
Xint error;
X{
X switch (error) {
X case IFFERR_EOF:
X Write(Output(), "IFFError: Reached logical end of file\n
X", 38);
X break;
X case IFFERR_EOC:
X Write(Output(), "IFFError: About to leave context\n", 33
X);
X break;
X case IFFERR_NOSCOPE:
X Write(Output(), "IFFError: No valid scope for property\n
X", 38);
X break;
X case IFFERR_NOMEM:
X Write(Output(), "IFFError: Internal memory alloc failed\
Xn", 39);
X break;
X case IFFERR_READ:
X Write(Output(), "IFFError: Stream read error\n", 28);
X break;
X case IFFERR_WRITE:
X Write(Output(), "IFFError: Stream write error\n", 29);
X break;
X case IFFERR_SEEK:
X Write(Output(), "IFFError: Stream seek error\n", 28);
X break;
X case IFFERR_MANGLED:
X Write(Output(), "IFFError: Data in file is corrupt\n",34
X );
X break;
X case IFFERR_SYNTAX:
X Write(Output(), "IFFError: IFF syntax error\n", 27);
X break;
X case IFFERR_NOTIFF:
X Write(Output(), "IFFError: Not an IFF file\n", 26);
X break;
X case IFFERR_NOHOOK:
X Write(Output(), "IFFError: No call-back hook provided\n"
X, 37);
X break;
X case IFF_RETURN2CLIENT:
X Write(Output(), "IFFError: Client handler normal return\
Xn", 39);
X break;
X default:
X Write(Output(), "IFFError: unknown error encountered\n",
X 36);
X } /* switch (error) */
X}
X
END_OF_FILE
if test 9075 -ne `wc -c <'Macto8SVX.c'`; then
echo shar: \"'Macto8SVX.c'\" unpacked with wrong size!
fi
# end of 'Macto8SVX.c'
fi
if test -f 'Macto8SVX.doc' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'Macto8SVX.doc'\"
else
echo shar: Extracting \"'Macto8SVX.doc'\" \(912 characters\)
sed "s/^X//" >'Macto8SVX.doc' <<'END_OF_FILE'
X
X
X Mac_To_8SVX
X by
X Tim Friest
X 8-Aug-1990
X
XMacTo8SVX is a AmigaOS 2.0 program which converts Macintosh digitized sound
Xdata to an Amiga IFF 8SVX sound file.
X
XThe program assumes that the Mac data is simply that (a stream of bytes
Xwithout a header, resource fork, or whatever). I got the speeds for the
Xsampling rates from the March/April 1990 AmigaMail article by John Orr.
X
XThis program only runs under AmigaOS 2.0 (I couldn't resist the IFFParse
Xlibrary or the new DOS calls... Thanks to Leo, Stuart, and C=.
X
XThis program is not copyrighted and may be destributed or modified in any
Xway you desire. If you make modifications, I'd appreciate credit where due.
X
XI can be reached:
X
XUSMail: Tim Friest BIX: TFRIEST
X 211 McCarrey #1
X Anchorage, AK 99508
END_OF_FILE
if test 912 -ne `wc -c <'Macto8SVX.doc'`; then
echo shar: \"'Macto8SVX.doc'\" unpacked with wrong size!
fi
# end of 'Macto8SVX.doc'
fi
echo shar: End of archive 1 \(of 1\).
cp /dev/null ark1isdone
MISSING=""
for I in 1 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have the archive.
rm -f ark[1-9]isdone
else
echo You still need to unpack the following archives:
echo " " ${MISSING}
fi
## End of shell archive.
exit 0
--
Mail submissions (sources or binaries) to <amiga@uunet.uu.net>.
Mail comments to the moderator at <amiga-request@uunet.uu.net>.
Post requests for sources, and general discussion to comp.sys.amiga.