From f52cc8a434275df2c85894953cc562e33611543e Mon Sep 17 00:00:00 2001 From: dwsJason Date: Sun, 29 Nov 2020 15:12:38 -0500 Subject: [PATCH] import: audio player skeleton, based on the the joeylib test application --- audioplayer/player.c | 456 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 456 insertions(+) create mode 100644 audioplayer/player.c diff --git a/audioplayer/player.c b/audioplayer/player.c new file mode 100644 index 0000000..b6ccdda --- /dev/null +++ b/audioplayer/player.c @@ -0,0 +1,456 @@ +/* + * JoeyLib Based Example Audio Player + * Copyright (C) 2020 Scott Duensing + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. +*/ + + +#include +#include +#include +#include + + +#define JOEY_MAIN +#include "joey.h" +#ifdef JOEY_IIGS +segment "audioapp"; +#endif + + +#ifdef DMALLOC +#define DMALLOC_FUNC_CHECK +#include "dmalloc.h" +#endif + + +void help(jlSurfaceT source, jlStnT *stencil, jint16 sx, jint16 sy, jint16 tx, jint16 ty) { + + int mo; // Mask offset + int x; + int y; + byte b; // Mask bit index + + printf("\n"); + + mo = ((sy & 0x1f) * 8 * 40) + (sx & 0x3f); // This is in tiles + + printf("Offset: %04x sx: %02x sy: %02x\n", mo, sx, sy); + + for (y=0; y<8; y++) { + b = 7; + printf("Byte: %02x ", stencil->pixels[mo]); + for (x=0; x<4; x++) { + if ((stencil->pixels[mo] & (1 << b--)) != 0) { + printf("X"); + } else { + printf("."); + } + if ((stencil->pixels[mo] & (1 << b--)) != 0) { + printf("X"); + } else { + printf("."); + } + } + mo += 40; + printf("\n"); + } + + jlDrawBlit8x8a(source, stencil, sx, sy, tx, ty); +} + + +// Font hacking! +__attribute__((__format__ (__printf__, 5, 0))) +void fontPrint(jlImgT *font, jlStnT *stencil, jint16 cx, jint16 cy, const char *what, ...) { + jint16 x; + jint16 y; + jint16 tx; + jint16 ty; + jint16 counter; + char msg[40]; // Very short messages (screen width). Be careful! + va_list va; + + va_start(va, what); + vsprintf(msg, what, va); + va_end(va); + + tx = cx * 8; + ty = cy * 8; + + for (counter=0; counter<(int)strlen(msg); counter++) { + x = (msg[counter] % 40) * 8; + y = (msg[counter] / 40) * 8; + if (stencil) { +#ifdef JOEY_PC + help(jlImgSurfaceGet(font), stencil, x, y, tx, ty); +#else + jlDrawBlit8x8a(jlImgSurfaceGet(font), stencil, x, y, tx, ty); +#endif + } else { + jlDrawBlit8x8(jlImgSurfaceGet(font), x, y, tx, ty); + } + tx += 8; + } +} + + +void blitTest(void) { + jlImgT *font = NULL; + jlStnT *stencil = NULL; + jint16 y; + jint16 x; + + if (!jlImgLoad(font, "font")) jlUtilDie("Unable to load font.img!"); + if (!jlStnLoad(stencil, "font")) jlUtilDie("Unable to load font.stn!"); + + jlImgDisplay(font); + jlDisplayPresent(); + jlKeyWaitForAny(); + + jlDrawColorSet(1); + jlDrawClear(); + jlPaletteSet(15, 15, 15, 15); + + fontPrint(font, NULL, 1, 2, "%s", "Blitting without stencil buffer."); + fontPrint(font, stencil, 1, 4, "%s", "Blitting with stencil buffer."); + jlDisplayPresent(); + jlKeyWaitForAny(); + + y = 91; + while (!jlKeyPressed()) { + for (x=0; x<319-8; x++) { + jlDrawBlit8x8(jlImgSurfaceGet(font), 8, 0, x, y); + fontPrint(font, NULL, 1, 6, "Drawing at %d x %d ", x, y); + jlDisplayPresent(); + jlDrawBlit8x8(jlImgSurfaceGet(font), 0, 0, x, y); + jlUtilSleep(1); + if (jlKeyPressed()) { + break; + } + } + } + jlKeyRead(); + + jlStnFree(stencil); + jlImgFree(font); +} + + +void exerciseAPI(void) { + + jlImgT *screen = NULL; + + jlDrawColorSet(0); + jlDrawClear(); + jlDrawColorSet(15); + + jlDrawPixelSet(10, 10); + assert(jlDrawPixelGet(10, 10) == 15); + + // Should be able to grab the screen twice without allocation issues. + jlImgCreate(screen); + jlImgCreate(screen); + jlImgFree(screen); +} + + +void grid(void) { + int i; + + jlDrawColorSet(0); + jlDrawClear(); + jlDrawColorSet(15); + + for (i=0; i<320; i+=8) { + jlDrawLine(i, 0, i, 199); + } + for (i=0; i<200; i+=8) { + jlDrawLine(0, i, 319, i); + } + + while (!jlKeyPressed()) { + jlDisplayPresent(); + } + jlKeyRead(); +} + + +void lineTest(void) { + + jlImgT *kanga = NULL; + jlImgT *font = NULL; + jint16 y; + jint16 phase = 0; + jint16 x2 = 0; + jint16 y2 = 0; + jint16 ox = 0; + jint16 oy = 0; + jint16 op = 0; + jint16 color = 15; + jint16 nextColor = 1; + char what[32]; + + if (!jlImgLoad(kanga, "kanga")) jlUtilDie("Unable to load kanga.img!"); + if (!jlImgLoad(font, "font")) jlUtilDie("Unable to load font.img!"); + + jlImgDisplay(kanga); + jlDrawColorSet(1); + jlDrawBox(0, 0, 319, 199); + + //jlSoundMusicPlay("music"); + + jlPaletteSet(15, 15, 15, 15); + strcpy(what, "Left to Right"); + + while (!jlKeyPressed()) { + y = 17; + fontPrint(font, NULL, 1, y++, "Drawing %s ", what); + + jlDrawColorSet((byte)color); + if (phase < 2) { + jlDrawLine(x2, y2, 319-x2, 199-y2); + } else { + jlDrawLine(319-x2, 199-y2, x2, y2); + } + ox = x2; + oy = y2; + op = phase; + + switch (phase) { + // Left, Y incrementing + case 0: + y2++; + if (y2 == 199) { + strcpy(what, "Bottom to Top"); + phase = 1; + } + break; + + // Bottom, X incrementing + case 1: + x2++; + if (x2 == 319) { + strcpy(what, "Right to Left"); + phase = 2; + } + break; + + // Right, Y decrementing + case 2: + y2--; + if (y2 == 0) { + strcpy(what, "Top to Bottom"); + phase = 3; + } + break; + + // Top, X decrementing + case 3: + x2--; + if (x2 == 0) { + strcpy(what, "Left to Right"); + phase = 0; + } + break; + } + + jlDisplayPresent(); + + jlDrawColorSet((byte)0); + if (op < 2) { + jlDrawLine(ox, oy, 319-ox, 199-oy); + } else { + jlDrawLine(319-ox, 199-oy, ox, oy); + } + + color = nextColor; + nextColor++; + if (nextColor > 15) { + nextColor = 1; + } + } + jlKeyRead(); + + jlImgFree(font); + jlImgFree(kanga); +} + + +void musicTest(void) { + jlImgT *kanga = NULL; + jlImgT *font = NULL; + + if (!jlImgLoad(kanga, "kanga")) jlUtilDie("Unable to load kanga.img!"); + if (!jlImgLoad(font, "font")) jlUtilDie("Unable to load font.img!"); + + jlImgDisplay(kanga); + jlDisplayPresent(); + + jlSoundModPlay("music"); + + while (!jlKeyPressed()) { + fontPrint(font, NULL, 1, 1, "%dx%d %d %d ", jlGameGetAxis(0), jlGameGetAxis(1), jlGameGetButton(0), jlGameGetButton(1)); + jlDisplayPresent(); + } + jlKeyRead(); + + jlSoundModStop(); + + jlImgFree(font); + jlImgFree(kanga); +} + + +void showStencil(void) { + jlStnT *stencil = NULL; + jint16 y; + jint16 x; + jint16 count; + juint16 index; + byte bit; + + if (!jlStnLoad(stencil, "font")) jlUtilDie("Unable to load font.stn!"); + + jlDrawColorSet(0); + jlDrawClear(); + jlDrawColorSet(15); + + // Draw stencil to screen linerally + index = -1; + count = 0; + for (y=0; y<200; y++) { + for (x=0; x<320; x++) { + count--; + if (count < 0) { + count = 7; + index++; + bit = stencil->pixels[index]; + } + if (bit & (1 << count)) { + jlDrawPixelSet(x, y); + } + } + jlDisplayPresent(); + } + jlKeyWaitForAny(); + + jlDrawColorSet(0); + jlDrawClear(); + jlDrawColorSet(15); + + // Draw stencil by pixel location - this fails on the IIgs + for (y=0; y<200; y++) { + for (x=0; x<320; x++) { + index = (y * 320 + x); + count = 7 - (index % 8); + index /= 8; + bit = stencil->pixels[index]; + if (bit & (1 << count)) { + jlDrawPixelSet(x, y); + } + } + jlDisplayPresent(); + } + jlKeyWaitForAny(); + +} + + +void stencilTest(void) { + jlImgT *kangaI = NULL; + jlImgT *biffI = NULL; + jlStnT *biffS = NULL; + jint16 y; + jint16 x; + jint16 i; + jint16 j; + + if (!jlImgLoad(kangaI, "kanga")) jlUtilDie("Unable to load kanga.img!"); + if (!jlImgLoad(biffI, "biff")) jlUtilDie("Unable to load biff.img!"); + if (!jlStnLoad(biffS, "biff")) jlUtilDie("Unable to load biff.stn!"); + + jlImgDisplay(kangaI); + + y = 50; + + while (!jlKeyPressed()) { + // Draw Biff & grab background + for (x=0; x<319-32; x++) { + for (i=0; i<3; i++) { + for (j=0; j<4; j++) { + jlDrawSurfaceSet(jlImgSurfaceGet(biffI)); + jlDrawBlit8x8(JOEY_DISPLAY, x + (j * 8), y + (i * 8), j * 8 + 32, i * 8 + 32); + jlDrawSurfaceSet(JOEY_DISPLAY); + jlDrawBlit8x8a(jlImgSurfaceGet(biffI), biffS, j * 8, i * 8, x + (j * 8), y + (i * 8)); + } + } + jlDisplayPresent(); + // Erase Biff + for (i=0; i<3; i++) { + for (j=0; j<4; j++) { + jlDrawBlit8x8(jlImgSurfaceGet(biffI), j * 8 + 32, i * 8 + 32, x + (j * 8), y + (i * 8)); + } + } + // Check for early quit + if (jlKeyPressed()) { + break; + } + } + } + jlKeyRead(); + + jlStnFree(biffS); + jlImgFree(biffI); + jlImgFree(kangaI); +} + + +void timerTest(void) { + jlImgT *font = NULL; + + if (!jlImgLoad(font, "font")) jlUtilDie("Unable to load font.img!"); + + jlDrawColorSet(0); + jlDrawClear(); + + while (!jlKeyPressed()) { + fontPrint(font, NULL, 1, 1, "Timer: %d ", jlUtilTimer()); + jlDisplayPresent(); + } + jlKeyRead(); + + jlImgFree(font); +} + + +int main(void) { + jlUtilStartup("JoeyLib Audio"); + + //blitTest(); + //exerciseAPI(); + //grid(); + //lineTest(); + //musicTest(); + //showStencil(); + stencilTest(); + //timerTest(); + + jlUtilShutdown(); +} +