--- BasiliskII/src/audio.cpp 2000/07/25 17:02:23 1.6 +++ BasiliskII/src/audio.cpp 2005/01/30 21:42:13 1.15 @@ -1,8 +1,8 @@ /* * audio.cpp - Audio support * - * Basilisk II (C) 1997-2000 Christian Bauer - * Portions (C) 1997-1999 Marc Hellwig + * Basilisk II (C) 1997-2005 Christian Bauer + * Portions written by Marc Hellwig * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -36,6 +36,11 @@ #include "debug.h" +// Supported sample rates, sizes and channels +vector audio_sample_rates; +vector audio_sample_sizes; +vector audio_channel_counts; + // Global variables struct audio_status AudioStatus; // Current audio status (sample rate etc.) bool audio_open = false; // Flag: audio is initialized and ready @@ -65,7 +70,6 @@ static int32 AudioGetInfo(uint32 infoPtr { D(bug(" AudioGetInfo %c%c%c%c, infoPtr %08lx, source ID %08lx\n", selector >> 24, (selector >> 16) & 0xff, (selector >> 8) & 0xff, selector & 0xff, infoPtr, sourceID)); M68kRegisters r; - int i; switch (selector) { case siSampleSize: @@ -73,15 +77,15 @@ static int32 AudioGetInfo(uint32 infoPtr break; case siSampleSizeAvailable: { - r.d[0] = audio_num_sample_sizes * 2; + r.d[0] = audio_sample_sizes.size() * 2; Execute68kTrap(0xa122, &r); // NewHandle() uint32 h = r.a[0]; if (h == 0) return memFullErr; - WriteMacInt16(infoPtr + sil_count, audio_num_sample_sizes); + WriteMacInt16(infoPtr + sil_count, audio_sample_sizes.size()); WriteMacInt32(infoPtr + sil_infoHandle, h); uint32 sp = ReadMacInt32(h); - for (i=0; i> 24, (selector >> 16) & 0xff, (selector >> 8) & 0xff, selector & 0xff, infoPtr, sourceID)); M68kRegisters r; - int i; switch (selector) { case siSampleSize: D(bug(" set sample size %08lx\n", infoPtr)); if (AudioStatus.num_sources) return siDeviceBusyErr; - for (i=0; i= 0x100) + goto delegate; + else + return badComponentSelector; } } @@ -549,29 +611,29 @@ int16 SoundInStatus(uint32 pb, uint32 dc case siDeviceIcon: { M68kRegisters r; - static const uint16 proc[] = { - 0x558f, // subq.l #2,sp - 0xa994, // CurResFile - 0x4267, // clr.w -(sp) - 0xa998, // UseResFile - 0x598f, // subq.l #4,sp - 0x4879, 0x4943, 0x4e23, // move.l #'ICN#',-(sp) - 0x3f3c, 0xbf76, // move.w #-16522,-(sp) - 0xa9a0, // GetResource - 0x245f, // move.l (sp)+,a2 - 0xa998, // UseResFile - 0x200a, // move.l a2,d0 - 0x6604, // bne 1 - 0x7000, // moveq #0,d0 - M68K_RTS, - 0x2f0a, //1 move.l a2,-(sp) - 0xa992, // DetachResource - 0x204a, // move.l a2,a0 - 0xa04a, // HNoPurge - 0x7001, // moveq #1,d0 - M68K_RTS + static const uint8 proc[] = { + 0x55, 0x8f, // subq.l #2,sp + 0xa9, 0x94, // CurResFile + 0x42, 0x67, // clr.w -(sp) + 0xa9, 0x98, // UseResFile + 0x59, 0x8f, // subq.l #4,sp + 0x48, 0x79, 0x49, 0x43, 0x4e, 0x23, // move.l #'ICN#',-(sp) + 0x3f, 0x3c, 0xbf, 0x76, // move.w #-16522,-(sp) + 0xa9, 0xa0, // GetResource + 0x24, 0x5f, // move.l (sp)+,a2 + 0xa9, 0x98, // UseResFile + 0x20, 0x0a, // move.l a2,d0 + 0x66, 0x04, // bne 1 + 0x70, 0x00, // moveq #0,d0 + M68K_RTS >> 8, M68K_RTS & 0xff, + 0x2f, 0x0a, //1 move.l a2,-(sp) + 0xa9, 0x92, // DetachResource + 0x20, 0x4a, // move.l a2,a0 + 0xa0, 0x4a, // HNoPurge + 0x70, 0x01, // moveq #1,d0 + M68K_RTS >> 8, M68K_RTS & 0xff }; - Execute68k((uint32)proc, &r); + Execute68k(Host2MacAddr((uint8 *)proc), &r); if (r.d[0]) { param[0] = 4; // Length of returned data param[1] = r.a[2]; // Handle to icon suite