From 2de9253b6c1e67281c4c4ef2a5e89d54a61d8e34 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Wed, 2 Aug 2023 12:13:35 -0400 Subject: [PATCH] test: Added testaudio --- test/CMakeLists.txt | 1 + test/audiofile.bmp | Bin 0 -> 65674 bytes test/logaudiodev.bmp | Bin 0 -> 65674 bytes test/physaudiodev.bmp | Bin 0 -> 65674 bytes test/soundboard.bmp | Bin 0 -> 65674 bytes test/soundboard_levels.bmp | Bin 0 -> 2698 bytes test/speaker.bmp | Bin 0 -> 65674 bytes test/testaudio-art.txt | 8 + test/testaudio.c | 1064 ++++++++++++++++++++++++++++++++++++ test/trashcan.bmp | Bin 0 -> 65674 bytes 10 files changed, 1073 insertions(+) create mode 100644 test/audiofile.bmp create mode 100644 test/logaudiodev.bmp create mode 100644 test/physaudiodev.bmp create mode 100644 test/soundboard.bmp create mode 100644 test/soundboard_levels.bmp create mode 100644 test/speaker.bmp create mode 100644 test/testaudio-art.txt create mode 100644 test/testaudio.c create mode 100644 test/trashcan.bmp diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index ee8b87169..d207a9afd 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -202,6 +202,7 @@ if(Python3_FOUND AND Python3_VERSION VERSION_GREATER_EQUAL "3.2") endforeach() endif() +add_sdl_test_executable(testaudio NEEDS_RESOURCES TESTUTILS SOURCES testaudio.c) add_sdl_test_executable(testfile NONINTERACTIVE SOURCES testfile.c) add_sdl_test_executable(testcontroller TESTUTILS SOURCES testcontroller.c gamepadutils.c ${gamepad_image_headers}) add_sdl_test_executable(testgeometry TESTUTILS SOURCES testgeometry.c) diff --git a/test/audiofile.bmp b/test/audiofile.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f8b8106d6ecf70326ee677a9b3896cdfd8b59723 GIT binary patch literal 65674 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 F{{w+htyKU3 literal 0 HcmV?d00001 diff --git a/test/physaudiodev.bmp b/test/physaudiodev.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1d4da24643f61a7c4c6e16d93144ab003b513328 GIT binary patch literal 65674 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 W(82>PJkY`eEj-Y|1OGL6;Qs?9LpXT= literal 0 HcmV?d00001 diff --git a/test/soundboard.bmp b/test/soundboard.bmp new file mode 100644 index 0000000000000000000000000000000000000000..032b8984366d87ad2eb09096807af0226c3d369f GIT binary patch literal 65674 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 literal 0 HcmV?d00001 diff --git a/test/soundboard_levels.bmp b/test/soundboard_levels.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ce4cd5ba77342a16d7feaf17ed34f93d77294ed9 GIT binary patch literal 2698 zcmc)IYfO_@7zc2+eOt0kx49{(pcN>zMJUXu2pCG~{cQm)n4xU}l|r0mMnOO)^8z$Z zL0!~MsM9E3K)j%A0~Ds*qzDDU3CN|i)CuLXWSd~%**R}psHmH|4{Q4C|JxADJMUh&g=8H z4{hhp|NOqtMb;s3mOT_=F7ggC$uXYG9*WQ!;i~8)s8L-3_Mro7{SvkQvqIXA#GW>k zWK_X~^s4ca^r|tl$}zlNN~(lX6`of-i4RN~-4vYK8sr$!SgNXkp1eoT%SUVZMw0%b z5%d>(L0@1XWvo63$swvXwqr!ojeWPwdwAcfVDhZ~k{%4$=a)1*y_~k8u6X z{pIF;>p3zlXK@WWkM&;dM!KN4unRI|nUJ=6|6gSNfimd5(mipGJd5VG=X(n~!FUbp z0OR$CppqYey^-JizI2AD=hz0d;b!Iyn5r!629#x$LfJvA1j-H-LpgT17&daYLIRO$ z^qv+x~p>@9~46~`~bi(NwNNVZi08W+Hq#22uEy+s@BB-U1{^TAZ1`Dc}A zzp@qvEDpq_LV`F&!*^@BbPzJ;G<*zJj<2Kk9wxuq>!B=;3=N^6Sc{N~nCY(Uy zmrGcwfXzgF%hH)%gDfY%Rw0#rPr~4~O6Z&i5<0gvgu!bI_29LKEfjRD@Dy}Py@k4P zACX?l6zZf*k&d&#e@MxSsq=TB{l=c}^B~MCpf!%qd#dE~MwNX2sFF7YS1=mO<&UiA z2u74V;nOhYvhh^8Vwg?w`ZYHrp{L&U%=t4=lh|;1HWoH2#Nm9bMiOQz}Dzi@e(>@sKId5?RC8D#HhvwG) zIP>9X@_Lexx=_@8$;7nk`AN2XOP@y z8PMF?7pJ8!?s;rSG$cu7x7n0=omY=Cjl5VM7I5!}&weej!E6 z9cP-jE(=;j?(Q0lpwa6v5l*_tU4rIuS4{J)$0T&G1__-1{hYCZ9GGB2W0Tsf{{&?3 z2?r&Mcb1^dscyNw1I7oBzX0kvXo31q_EJO6-j%36IG3Q$slH#a9ma>ge*x5UXlh^F zCmV9oRzNH(=nPq3nF8a(-%at7ewKTx)50J&Fz__T<)ii=PsPA})Z<^Fd*ZudyW{*o z;kP(Hi1L0v-|f>T5p8xAzKfNZF}KFd@s5}=N#fyDi*a3N=+-Rtxy)YhK`)Q`Nh7Ye zvi86^*$4NV?89~axO?>yW&y4(%G(7k+EcG(*CqmFzKbph+-Ftb+A*koE$YlThzVGB z;{U9V_V-o)m+z1AUy>8-JiYZzf4|7ZUb!sFdwu9xYVkd632F9~R@UcgP5fNZ|E_D* IBF2Tk0c-))uK)l5 literal 0 HcmV?d00001 diff --git a/test/speaker.bmp b/test/speaker.bmp new file mode 100644 index 0000000000000000000000000000000000000000..56f3dc1ae6699c9fc89daa9b8925c2ebacfab52b GIT binary patch literal 65674 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 LgGw8Pr@{XNkWPDZ literal 0 HcmV?d00001 diff --git a/test/testaudio-art.txt b/test/testaudio-art.txt new file mode 100644 index 000000000..f30a3d24e --- /dev/null +++ b/test/testaudio-art.txt @@ -0,0 +1,8 @@ +The .bmp files used by testaudio.c were made by AlDraw: + +https://linktr.ee/AlexDraw + +They may be distributed as public domain files! + + + diff --git a/test/testaudio.c b/test/testaudio.c new file mode 100644 index 000000000..d8ca14056 --- /dev/null +++ b/test/testaudio.c @@ -0,0 +1,1064 @@ +#include + +#ifdef __EMSCRIPTEN__ +#include +#endif + +#include +#include +#include +#include "testutils.h" + +#define POOF_LIFETIME 250 + +typedef struct Texture +{ + SDL_Texture *texture; + float w; + float h; +} Texture; + +typedef enum ThingType +{ + THING_NULL, + THING_PHYSDEV, + THING_PHYSDEV_CAPTURE, + THING_LOGDEV, + THING_LOGDEV_CAPTURE, + THING_TRASHCAN, + THING_STREAM, + THING_POOF, + THING_WAV +} ThingType; + + +typedef struct Thing Thing; + +struct Thing +{ + ThingType what; + + union { + struct { + SDL_AudioDeviceID devid; + SDL_bool iscapture; + SDL_AudioSpec spec; + char *name; + } physdev; + struct { + SDL_AudioDeviceID devid; + SDL_bool iscapture; + SDL_AudioSpec spec; + Thing *physdev; + } logdev; + struct { + SDL_AudioSpec spec; + Uint8 *buf; + Uint32 buflen; + } wav; + struct { + float startw; + float starth; + float centerx; + float centery; + } poof; + struct { + SDL_AudioStream *stream; + int total_ticks; + Uint64 next_level_update; + Uint8 levels[5]; + } stream; + } data; + + Thing *line_connected_to; + char *titlebar; + SDL_FRect rect; + float z; + Uint8 r, g, b, a; + float progress; + float scale; + Uint64 createticks; + Texture *texture; + const ThingType *can_be_dropped_onto; + + void (*ontick)(Thing *thing, Uint64 now); + void (*ondrag)(Thing *thing, int button, float x, float y); + void (*ondrop)(Thing *thing, int button, float x, float y); + void (*ondraw)(Thing *thing, SDL_Renderer *renderer); + + Thing *prev; + Thing *next; +}; + + +static Uint64 app_ready_ticks = 0; +static int done = 0; +static SDLTest_CommonState *state = NULL; + +static Thing *things = NULL; +static char *current_titlebar = NULL; + +static Thing *droppable_highlighted_thing = NULL; +static Thing *dragging_thing = NULL; +static int dragging_button = -1; + +static Texture *physdev_texture = NULL; +static Texture *logdev_texture = NULL; +static Texture *audio_texture = NULL; +static Texture *trashcan_texture = NULL; +static Texture *soundboard_texture = NULL; +static Texture *soundboard_levels_texture = NULL; + +static void DestroyTexture(Texture *tex); + +/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */ +static void Quit(int rc) +{ + DestroyTexture(physdev_texture); + DestroyTexture(logdev_texture); + DestroyTexture(audio_texture); + DestroyTexture(trashcan_texture); + DestroyTexture(soundboard_texture); + DestroyTexture(soundboard_levels_texture); + SDLTest_CommonQuit(state); + /* Let 'main()' return normally */ + if (rc != 0) { + exit(rc); + } +} + +static char *xstrdup(const char *str) +{ + char *ptr = SDL_strdup(str); + if (!ptr) { + SDL_Log("Out of memory!"); + Quit(1); + } + return ptr; +} + +static void *xalloc(const size_t len) +{ + void *ptr = SDL_calloc(1, len); + if (!ptr) { + SDL_Log("Out of memory!"); + Quit(1); + } + return ptr; +} + + +static void SetTitleBar(const char *fmt, ...) +{ + char *newstr = NULL; + va_list ap; + va_start(ap, fmt); + SDL_vasprintf(&newstr, fmt, ap); + va_end(ap); + + if (newstr && (!current_titlebar || (SDL_strcmp(current_titlebar, newstr) != 0))) { + SDL_SetWindowTitle(state->windows[0], newstr); + SDL_free(current_titlebar); + current_titlebar = newstr; + } else { + SDL_free(newstr); + } +} + +static void SetDefaultTitleBar(void) +{ + SetTitleBar("testaudio: %s", SDL_GetCurrentAudioDriver()); +} + +static Thing *FindThingAtPoint(const float x, const float y) +{ + const SDL_FPoint pt = { x, y }; + Thing *retval = NULL; + Thing *i; + for (i = things; i != NULL; i = i->next) { + if ((i != dragging_thing) && SDL_PointInRectFloat(&pt, &i->rect)) { + retval = i; /* keep going, though, because things drawn on top are later in the list. */ + } + } + return retval; +} + +static Thing *UpdateMouseOver(const float x, const float y) +{ + Thing *thing; + + if (dragging_thing) { + thing = dragging_thing; + } else { + thing = FindThingAtPoint(x, y); + } + + if (!thing) { + SetDefaultTitleBar(); + } else if (thing->titlebar) { + SetTitleBar("%s", thing->titlebar); + } + + return thing; +} + +static Thing *CreateThing(ThingType what, float x, float y, float z, float w, float h, Texture *texture, char *titlebar) +{ + Thing *last = NULL; + Thing *i; + Thing *thing; + + thing = (Thing *) xalloc(sizeof (Thing)); + if ((w < 0) || (h < 0)) { + SDL_assert(texture != NULL); + if (w < 0) { + w = texture->w; + } + if (h < 0) { + h = texture->h; + } + } + + thing->what = what; + thing->rect.x = x; + thing->rect.y = y; + thing->rect.w = w; + thing->rect.h = h; + thing->z = z; + thing->r = 255; + thing->g = 255; + thing->b = 255; + thing->a = 255; + thing->scale = 1.0f; + thing->createticks = SDL_GetTicks(); + thing->texture = texture; + thing->titlebar = titlebar; + + /* insert in list by Z order (furthest from the "camera" first, so they get drawn over; negative Z is not drawn at all). */ + if (things == NULL) { + things = thing; + return thing; + } + + for (i = things; i != NULL; i = i->next) { + if (z > i->z) { /* insert here. */ + thing->next = i; + thing->prev = i->prev; + + SDL_assert(i->prev == last); + + if (i->prev) { + i->prev->next = thing; + } else { + SDL_assert(i == things); + things = thing; + } + i->prev = thing; + return thing; + } + last = i; + } + + if (last) { + last->next = thing; + thing->prev = last; + } + return thing; +} + +static void DestroyThing(Thing *thing) +{ + if (!thing) { + return; + } + + switch (thing->what) { + case THING_POOF: break; + case THING_NULL: break; + case THING_TRASHCAN: break; + case THING_LOGDEV: + case THING_LOGDEV_CAPTURE: + SDL_CloseAudioDevice(thing->data.logdev.devid); + break; + case THING_PHYSDEV: + case THING_PHYSDEV_CAPTURE: + SDL_free(thing->data.physdev.name); + break; + case THING_WAV: + SDL_free(thing->data.wav.buf); + break; + case THING_STREAM: + SDL_DestroyAudioStream(thing->data.stream.stream); + break; + } + + if (thing->prev) { + thing->prev->next = thing->next; + } else { + SDL_assert(thing == things); + things = thing->next; + } + + if (thing->next) { + thing->next->prev = thing->prev; + } + + SDL_free(thing->titlebar); + SDL_free(thing); +} + +static void DrawOneThing(SDL_Renderer *renderer, Thing *thing) +{ + SDL_FRect dst; + SDL_memcpy(&dst, &thing->rect, sizeof (SDL_FRect)); + if (thing->scale != 1.0f) { + const float centerx = thing->rect.x + (thing->rect.w / 2); + const float centery = thing->rect.y + (thing->rect.h / 2); + SDL_assert(thing->texture != NULL); + dst.w = thing->texture->w * thing->scale; + dst.h = thing->texture->h * thing->scale; + dst.x = centerx - (dst.w / 2); + dst.y = centery - (dst.h / 2); + } + + if (thing->texture) { + if (droppable_highlighted_thing == thing) { + SDL_SetRenderDrawColor(renderer, 255, 0, 255, 100); + SDL_RenderFillRect(renderer, &dst); + } + SDL_SetRenderDrawColor(renderer, thing->r, thing->g, thing->b, thing->a); + SDL_RenderTexture(renderer, thing->texture->texture, NULL, &dst); + } else { + SDL_SetRenderDrawColor(renderer, thing->r, thing->g, thing->b, thing->a); + SDL_RenderFillRect(renderer, &dst); + } + + if (thing->ondraw) { + thing->ondraw(thing, renderer); + } + + if (thing->progress > 0.0f) { + SDL_FRect r = { thing->rect.x, thing->rect.y + (thing->rect.h + 2.0f), 0.0f, 10.0f }; + r.w = thing->rect.w * ((thing->progress > 1.0f) ? 1.0f : thing->progress); + SDL_SetRenderDrawColor(renderer, 255, 255, 255, 128); + SDL_RenderFillRect(renderer, &r); + } +} + +static void DrawThings(SDL_Renderer *renderer) +{ + Thing *i; + + /* draw connecting lines first, so they're behind everything else. */ + for (i = things; i && (i->z >= 0.0f); i = i->next) { + Thing *dst = i->line_connected_to; + if (dst) { + SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); + SDL_RenderLine(renderer, i->rect.x + (i->rect.w / 2), i->rect.y + (i->rect.h / 2), dst->rect.x + (dst->rect.w / 2), dst->rect.y + (dst->rect.h / 2)); + } + } + + /* Draw the actual things. */ + for (i = things; i && (i->z >= 0.0f); i = i->next) { + if (i != dragging_thing) { + DrawOneThing(renderer, i); + } + } + + if (dragging_thing) { + DrawOneThing(renderer, dragging_thing); /* draw last so it's always on top. */ + } +} + +static void Draw(void) +{ + SDL_Renderer *renderer = state->renderers[0]; + SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND); + SDL_SetRenderDrawColor(renderer, 64, 0, 64, 255); + SDL_RenderClear(renderer); + DrawThings(renderer); + SDL_RenderPresent(renderer); +} + +static void RepositionRowOfThings(const ThingType what, const float y) +{ + int total_things = 0; + float texw = 0.0f; + float texh = 0.0f; + Thing *i; + + for (i = things; i != NULL; i = i->next) { + if (i->what == what) { + texw = i->rect.w; + texh = i->rect.h; + total_things++; + } + } + + if (total_things > 0) { + int w, h; + SDL_GetWindowSize(state->windows[0], &w, &h); + const float spacing = w / ((float) total_things); + float x = (spacing - texw) / 2.0f; + for (i = things; i != NULL; i = i->next) { + if (i->what == what) { + i->rect.x = x; + i->rect.y = (y >= 0.0f) ? y : ((h + y) - texh); + x += spacing; + } + } + } +} + +static const char *AudioFmtToString(const SDL_AudioFormat fmt) +{ + switch (fmt) { + #define FMTCASE(x) case SDL_AUDIO_##x: return #x + FMTCASE(U8); + FMTCASE(S8); + FMTCASE(S16LSB); + FMTCASE(S16MSB); + FMTCASE(S32LSB); + FMTCASE(S32MSB); + FMTCASE(F32LSB); + FMTCASE(F32MSB); + #undef FMTCASE + } + return "?"; +} + +static const char *AudioChansToStr(const int channels) +{ + switch (channels) { + case 1: return "mono"; + case 2: return "stereo"; + case 3: return "2.1"; + case 4: return "quad"; + case 5: return "4.1"; + case 6: return "5.1"; + case 7: return "6.1"; + case 8: return "7.1"; + default: break; + } + return "?"; +} + +static void PoofThing_ondrag(Thing *thing, int button, float x, float y) +{ + dragging_thing = NULL; /* refuse to be dragged. */ +} + +static void PoofThing_ontick(Thing *thing, Uint64 now) +{ + const int lifetime = POOF_LIFETIME; + const int elasped = (int) (now - thing->createticks); + if (elasped > lifetime) { + DestroyThing(thing); + } else { + const float pct = ((float) elasped) / ((float) lifetime); + thing->a = (Uint8) (int) (255.0f - (pct * 255.0f)); + thing->scale = 1.0f - pct; /* shrink to nothing! */ + } +} + +static Thing *CreatePoofThing(Thing *poofing_thing) +{ + const float centerx = poofing_thing->rect.x + (poofing_thing->rect.w / 2); + const float centery = poofing_thing->rect.y + (poofing_thing->rect.h / 2); + const float z = poofing_thing->z; + Thing *thing = CreateThing(THING_POOF, poofing_thing->rect.x, poofing_thing->rect.y, z, poofing_thing->rect.w, poofing_thing->rect.h, poofing_thing->texture, NULL); + thing->data.poof.startw = poofing_thing->rect.w; + thing->data.poof.starth = poofing_thing->rect.h; + thing->data.poof.centerx = centerx; + thing->data.poof.centery = centery; + thing->ontick = PoofThing_ontick; + thing->ondrag = PoofThing_ondrag; + return thing; +} + +static void DestroyThingInPoof(Thing *thing) +{ + if (thing) { + if (thing->what != THING_POOF) { + CreatePoofThing(thing); + } + DestroyThing(thing); + } +} + +/* this poofs a thing and additionally poofs all things connected to the thing. */ +static void TrashThing(Thing *thing) +{ + Thing *i, *next; + for (i = things; i != NULL; i = next) { + next = i->next; + if (i->line_connected_to == thing) { + TrashThing(i); + next = things; /* start over in case this blew up the list. */ + } + } + DestroyThingInPoof(thing); +} + +static void StreamThing_ontick(Thing *thing, Uint64 now) +{ + if (!thing->line_connected_to) { + return; + } + + /* are we playing? See if we're done, or update state. */ + if (thing->line_connected_to->what == THING_LOGDEV) { + const int available = SDL_GetAudioStreamAvailable(thing->data.stream.stream); + SDL_AudioSpec spec; + if (!available || (SDL_GetAudioStreamFormat(thing->data.stream.stream, NULL, &spec) < 0)) { + DestroyThingInPoof(thing); + } else { + const int ticksleft = (int) ((((Uint64) ((available / (SDL_AUDIO_BITSIZE(spec.format) / 8)) / spec.channels)) * 1000) / spec.freq); + const float pct = thing->data.stream.total_ticks ? (((float) (ticksleft)) / ((float) thing->data.stream.total_ticks)) : 0.0f; + thing->progress = 1.0f - pct; + } + } + + if (thing->data.stream.next_level_update <= now) { + Uint64 perf = SDL_GetPerformanceCounter(); + int i; + for (i = 0; i < SDL_arraysize(thing->data.stream.levels); i++) { + thing->data.stream.levels[i] = (Uint8) (perf % 6); + perf >>= 3; + } + thing->data.stream.next_level_update += 150; + } +} + +static void StreamThing_ondrag(Thing *thing, int button, float x, float y) +{ + if (button == SDL_BUTTON_RIGHT) { /* this is kinda hacky, but use this to disconnect from a playing source. */ + if (thing->line_connected_to) { + SDL_UnbindAudioStream(thing->data.stream.stream); /* unbind from current device */ + thing->line_connected_to = NULL; + } + } +} + +static void StreamThing_ondrop(Thing *thing, int button, float x, float y) +{ + if (droppable_highlighted_thing) { + if (droppable_highlighted_thing->what == THING_TRASHCAN) { + TrashThing(thing); + } else if (((droppable_highlighted_thing->what == THING_LOGDEV) || (droppable_highlighted_thing->what == THING_LOGDEV_CAPTURE)) && (droppable_highlighted_thing != thing->line_connected_to)) { + /* connect to a logical device! */ + SDL_Log("Binding audio stream ('%s') to logical device %u", thing->titlebar, droppable_highlighted_thing->data.logdev.devid); + if (thing->line_connected_to) { + const SDL_AudioSpec *spec = &droppable_highlighted_thing->data.logdev.spec; + SDL_UnbindAudioStream(thing->data.stream.stream); /* unbind from current device */ + if (thing->line_connected_to->what == THING_LOGDEV_CAPTURE) { + SDL_FlushAudioStream(thing->data.stream.stream); + thing->data.stream.total_ticks = (int) (((((Uint64) (SDL_GetAudioStreamAvailable(thing->data.stream.stream) / (SDL_AUDIO_BITSIZE(spec->format) / 8))) / spec->channels) * 1000) / spec->freq); + } + } + + SDL_BindAudioStream(droppable_highlighted_thing->data.logdev.devid, thing->data.stream.stream); /* bind to new device! */ + + thing->progress = 0.0f; /* ontick will adjust this if we're on an output device.*/ + thing->data.stream.next_level_update = SDL_GetTicks() + 100; + thing->line_connected_to = droppable_highlighted_thing; + } + } +} + +static void StreamThing_ondraw(Thing *thing, SDL_Renderer *renderer) +{ + if (thing->line_connected_to) { /* are we playing? Update progress bar, and bounce the levels a little. */ + static const float xlocs[5] = { 18, 39, 59, 79, 99 }; + static const float ylocs[5] = { 49, 39, 29, 19, 10 }; + const float blockw = soundboard_levels_texture->w; + const float blockh = soundboard_levels_texture->h / 5.0f; + int i, j; + SDL_SetRenderDrawColor(renderer, thing->r, thing->g, thing->b, thing->a); + for (i = 0; i < SDL_arraysize(thing->data.stream.levels); i++) { + const int level = (int) thing->data.stream.levels[i]; + const float x = xlocs[i]; + for (j = 0; j < level; j++) { + const SDL_FRect src = { 0, soundboard_levels_texture->h - ((j+1) * blockh), blockw, blockh }; + const SDL_FRect dst = { thing->rect.x + x, thing->rect.y + ylocs[j], blockw, blockh }; + SDL_RenderTexture(renderer, soundboard_levels_texture->texture, &src, &dst); + } + } + } +} + +static Thing *CreateStreamThing(const SDL_AudioSpec *spec, const Uint8 *buf, const Uint32 buflen, const char *fname, const float x, const float y) +{ + static const ThingType can_be_dropped_onto[] = { THING_TRASHCAN, THING_LOGDEV, THING_LOGDEV_CAPTURE, THING_NULL }; + Thing *thing = CreateThing(THING_STREAM, x, y, 0, -1, -1, soundboard_texture, fname ? xstrdup(fname) : NULL); + SDL_Log("Adding audio stream for %s", fname); + thing->data.stream.stream = SDL_CreateAudioStream(spec, spec); + if (buf && buflen) { + SDL_PutAudioStreamData(thing->data.stream.stream, buf, (int) buflen); + SDL_FlushAudioStream(thing->data.stream.stream); + thing->data.stream.total_ticks = (int) (((((Uint64) (SDL_GetAudioStreamAvailable(thing->data.stream.stream) / (SDL_AUDIO_BITSIZE(spec->format) / 8))) / spec->channels) * 1000) / spec->freq); + } + thing->ontick = StreamThing_ontick; + thing->ondrag = StreamThing_ondrag; + thing->ondrop = StreamThing_ondrop; + thing->ondraw = StreamThing_ondraw; + thing->can_be_dropped_onto = can_be_dropped_onto; + return thing; +} + +static void WavThing_ondrag(Thing *thing, int button, float x, float y) +{ + if (button == SDL_BUTTON_RIGHT) { /* drag out a new audio stream. */ + dragging_thing = CreateStreamThing(&thing->data.wav.spec, thing->data.wav.buf, thing->data.wav.buflen, thing->titlebar, x - (thing->rect.w / 2), y - (thing->rect.h / 2)); + } +} + +static void WavThing_ondrop(Thing *thing, int button, float x, float y) +{ + if (droppable_highlighted_thing) { + if (droppable_highlighted_thing->what == THING_TRASHCAN) { + TrashThing(thing); + } + } +} + +static Thing *LoadWavThing(const char *fname, float x, float y) +{ + Thing *thing = NULL; + char *path; + SDL_AudioSpec spec; + Uint8 *buf = NULL; + Uint32 buflen = 0; + + path = GetNearbyFilename(fname); + if (path) { + fname = path; + } + + if (SDL_LoadWAV(fname, &spec, &buf, &buflen) == 0) { + static const ThingType can_be_dropped_onto[] = { THING_TRASHCAN, THING_NULL }; + char *titlebar = NULL; + const char *nodirs = SDL_strrchr(fname, '/'); + #ifdef __WINDOWS__ + const char *nodirs2 = SDL_strrchr(nodirs ? nodirs : fname, '\\'); + if (nodirs2) { + nodirs = nodirs2; + } + #endif + + SDL_Log("Adding WAV file '%s'", fname); + + if (nodirs) { + nodirs++; + } else { + nodirs = fname; + } + + SDL_asprintf(&titlebar, "WAV file (\"%s\", %s, %s, %uHz)", nodirs, AudioFmtToString(spec.format), AudioChansToStr(spec.channels), (unsigned int) spec.freq); + thing = CreateThing(THING_WAV, x - (audio_texture->w / 2), y - (audio_texture->h / 2), 5, -1, -1, audio_texture, titlebar); + SDL_memcpy(&thing->data.wav.spec, &spec, sizeof (SDL_AudioSpec)); + thing->data.wav.buf = buf; + thing->data.wav.buflen = buflen; + thing->can_be_dropped_onto = can_be_dropped_onto; + thing->ondrag = WavThing_ondrag; + thing->ondrop = WavThing_ondrop; + } + + SDL_free(path); + + return thing; +} + +static Thing *LoadStockWavThing(const char *fname) +{ + char *path = GetNearbyFilename(fname); + Thing *thing = LoadWavThing(path ? path : fname, 0.0f, 0.0f); /* will reposition in a moment. */ + SDL_free(path); + return thing; +} + +static void LoadStockWavThings(void) +{ + LoadStockWavThing("sample.wav"); + RepositionRowOfThings(THING_WAV, -10.0f); +} + +static void DestroyTexture(Texture *tex) +{ + if (tex) { + SDL_DestroyTexture(tex->texture); + SDL_free(tex); + } +} + +static Texture *CreateTexture(const char *fname) +{ + Texture *tex = (Texture *) xalloc(sizeof (Texture)); + int texw, texh; + tex->texture = LoadTexture(state->renderers[0], fname, SDL_TRUE, &texw, &texh); + if (!tex->texture) { + SDL_Log("Failed to load '%s': %s", fname, SDL_GetError()); + SDL_free(tex); + Quit(1); + } + SDL_SetTextureBlendMode(tex->texture, SDL_BLENDMODE_BLEND); + tex->w = (float) texw; + tex->h = (float) texh; + return tex; +} + +static Thing *CreateLogicalDeviceThing(Thing *parent, const SDL_AudioDeviceID which, const float x, const float y); + +static void DeviceThing_ondrag(Thing *thing, int button, float x, float y) +{ + if ((button == SDL_BUTTON_MIDDLE) && (thing->what == THING_LOGDEV_CAPTURE)) { /* drag out a new stream. This is a UX mess. :/ */ + dragging_thing = CreateStreamThing(&thing->data.logdev.spec, NULL, 0, NULL, x, y); + dragging_thing->data.stream.next_level_update = SDL_GetTicks() + 100; + SDL_BindAudioStream(thing->data.logdev.devid, dragging_thing->data.stream.stream); /* bind to new device! */ + dragging_thing->line_connected_to = thing; + } else if (button == SDL_BUTTON_RIGHT) { /* drag out a new logical device. */ + const SDL_AudioDeviceID which = ((thing->what == THING_LOGDEV) || (thing->what == THING_LOGDEV_CAPTURE)) ? thing->data.logdev.devid : thing->data.physdev.devid; + const SDL_AudioDeviceID devid = SDL_OpenAudioDevice(which, NULL); + dragging_thing = devid ? CreateLogicalDeviceThing(thing, devid, x - (thing->rect.w / 2), y - (thing->rect.h / 2)) : NULL; + } +} + +static void SetLogicalDeviceTitlebar(Thing *thing) +{ + SDL_AudioSpec *spec = &thing->data.logdev.spec; + SDL_GetAudioDeviceFormat(thing->data.logdev.devid, spec); + SDL_asprintf(&thing->titlebar, "Logical device #%u (%s, %s, %s, %uHz)", (unsigned int) thing->data.logdev.devid, thing->data.logdev.iscapture ? "CAPTURE" : "OUTPUT", AudioFmtToString(spec->format), AudioChansToStr(spec->channels), (unsigned int) spec->freq); +} + +static void LogicalDeviceThing_ondrop(Thing *thing, int button, float x, float y) +{ + if (droppable_highlighted_thing) { + if (droppable_highlighted_thing->what == THING_TRASHCAN) { + TrashThing(thing); + } + } +} + +static Thing *CreateLogicalDeviceThing(Thing *parent, const SDL_AudioDeviceID which, const float x, const float y) +{ + static const ThingType can_be_dropped_onto[] = { THING_TRASHCAN, THING_NULL }; + Thing *physthing = ((parent->what == THING_LOGDEV) || (parent->what == THING_LOGDEV_CAPTURE)) ? parent->data.logdev.physdev : parent; + const SDL_bool iscapture = physthing->data.physdev.iscapture; + Thing *thing; + + SDL_Log("Adding logical audio device %u", (unsigned int) which); + thing = CreateThing(iscapture ? THING_LOGDEV_CAPTURE : THING_LOGDEV, x, y, 5, -1, -1, logdev_texture, NULL); + thing->data.logdev.devid = which; + thing->data.logdev.iscapture = iscapture; + thing->data.logdev.physdev = physthing; + thing->line_connected_to = physthing; + thing->ondrag = DeviceThing_ondrag; + thing->ondrop = LogicalDeviceThing_ondrop; + thing->can_be_dropped_onto = can_be_dropped_onto; + + SetLogicalDeviceTitlebar(thing); + return thing; +} + +static void SetPhysicalDeviceTitlebar(Thing *thing) +{ + SDL_AudioSpec *spec = &thing->data.physdev.spec; + SDL_GetAudioDeviceFormat(thing->data.physdev.devid, spec); + if (thing->data.physdev.devid == SDL_AUDIO_DEVICE_DEFAULT_CAPTURE) { + SDL_asprintf(&thing->titlebar, "Default system device (CAPTURE, %s, %s, %uHz)", AudioFmtToString(spec->format), AudioChansToStr(spec->channels), (unsigned int) spec->freq); + } else if (thing->data.physdev.devid == SDL_AUDIO_DEVICE_DEFAULT_OUTPUT) { + SDL_asprintf(&thing->titlebar, "Default system device (OUTPUT, %s, %s, %uHz)", AudioFmtToString(spec->format), AudioChansToStr(spec->channels), (unsigned int) spec->freq); + } else { + SDL_asprintf(&thing->titlebar, "Physical device #%u (%s, \"%s\", %s, %s, %uHz)", (unsigned int) thing->data.physdev.devid, thing->data.physdev.iscapture ? "CAPTURE" : "OUTPUT", thing->data.physdev.name, AudioFmtToString(spec->format), AudioChansToStr(spec->channels), (unsigned int) spec->freq); + } +} + +static void PhysicalDeviceThing_ondrop(Thing *thing, int button, float x, float y) +{ + if (droppable_highlighted_thing) { + if (droppable_highlighted_thing->what == THING_TRASHCAN) { + TrashThing(thing); + } + } +} + +static void PhysicalDeviceThing_ontick(Thing *thing, Uint64 now) +{ + const int lifetime = POOF_LIFETIME; + const int elasped = (int) (now - thing->createticks); + if (elasped > lifetime) { + thing->scale = 1.0f; + thing->a = 255; + thing->ontick = NULL; /* no more ticking. */ + } else { + const float pct = ((float) elasped) / ((float) lifetime); + thing->a = (Uint8) (int) (pct * 255.0f); + thing->scale = pct; /* grow to normal size */ + } +} + + +static Thing *CreatePhysicalDeviceThing(const SDL_AudioDeviceID which, const SDL_bool iscapture) +{ + static const ThingType can_be_dropped_onto[] = { THING_TRASHCAN, THING_NULL }; + static float next_physdev_x = 0; + Thing *thing; + int winw, winh; + + SDL_GetWindowSize(state->windows[0], &winw, &winh); + if (next_physdev_x > (winw-physdev_texture->w)) { + next_physdev_x = 0; + } + + SDL_Log("Adding physical audio device %u", (unsigned int) which); + thing = CreateThing(iscapture ? THING_PHYSDEV_CAPTURE : THING_PHYSDEV, next_physdev_x, 170, 5, -1, -1, physdev_texture, NULL); + thing->data.physdev.devid = which; + thing->data.physdev.iscapture = iscapture; + thing->data.physdev.name = SDL_GetAudioDeviceName(which); + thing->ondrag = DeviceThing_ondrag; + thing->ondrop = PhysicalDeviceThing_ondrop; + thing->ontick = PhysicalDeviceThing_ontick; + thing->can_be_dropped_onto = can_be_dropped_onto; + + SetPhysicalDeviceTitlebar(thing); + if (SDL_GetTicks() <= (app_ready_ticks + 2000)) { /* assume this is the initial batch if it happens in the first two seconds. */ + RepositionRowOfThings(THING_PHYSDEV, 10.0f); /* don't rearrange them after the initial add. */ + RepositionRowOfThings(THING_PHYSDEV_CAPTURE, 170.0f); /* don't rearrange them after the initial add. */ + next_physdev_x = 0.0f; + } else { + next_physdev_x += physdev_texture->w * 1.5f; + } + + return thing; +} + +static Thing *CreateTrashcanThing(void) +{ + int winw, winh; + SDL_GetWindowSize(state->windows[0], &winw, &winh); + return CreateThing(THING_TRASHCAN, winw - trashcan_texture->w, winh - trashcan_texture->h, 10, -1, -1, trashcan_texture, "Drag things here to remove them."); +} + +static Thing *CreateDefaultPhysicalDevice(const SDL_bool iscapture) +{ + return CreatePhysicalDeviceThing(iscapture ? SDL_AUDIO_DEVICE_DEFAULT_CAPTURE : SDL_AUDIO_DEVICE_DEFAULT_OUTPUT, iscapture); +} + +static void TickThings(void) +{ + Thing *i; + Thing *next; + const Uint64 now = SDL_GetTicks(); + for (i = things; i != NULL; i = next) { + next = i->next; /* in case this deletes itself. */ + if (i->ontick) { + i->ontick(i, now); + } + } +} + +static void WindowResized(const int newwinw, const int newwinh) +{ + Thing *i; + const float neww = (float) newwinw; + const float newh = (float) newwinh; + const float oldw = (float) state->window_w; + const float oldh = (float) state->window_h; + for (i = things; i != NULL; i = i->next) { + const float halfw = i->rect.w / 2.0f; + const float halfh = i->rect.h / 2.0f; + const float x = (i->rect.x + halfw) / oldw; + const float y = (i->rect.y + halfh) / oldh; + i->rect.x = (x * neww) - halfw; + i->rect.y = (y * newh) - halfh; + } + state->window_w = newwinw; + state->window_h = newwinh; +} + + +static void Loop(void) +{ + SDL_Event event; + SDL_bool saw_event = SDL_FALSE; + + if (app_ready_ticks == 0) { + app_ready_ticks = SDL_GetTicks(); + } + + while (SDL_PollEvent(&event)) { + Thing *thing = NULL; + + saw_event = SDL_TRUE; + + switch (event.type) { + case SDL_EVENT_MOUSE_MOTION: + thing = UpdateMouseOver(event.motion.x, event.motion.y); + if ((dragging_button == -1) && event.motion.state) { + if (event.motion.state & SDL_BUTTON_LMASK) { + dragging_button = SDL_BUTTON_LEFT; + } else if (event.motion.state & SDL_BUTTON_RMASK) { + dragging_button = SDL_BUTTON_RIGHT; + } else if (event.motion.state & SDL_BUTTON_MMASK) { + dragging_button = SDL_BUTTON_MIDDLE; + } + + + if (dragging_button != -1) { + dragging_thing = thing; + if (thing && thing->ondrag) { + thing->ondrag(thing, dragging_button, event.motion.x, event.motion.y); + } + } + } + + droppable_highlighted_thing = NULL; + if (dragging_thing) { + dragging_thing->rect.x = event.motion.x - (dragging_thing->rect.w / 2); + dragging_thing->rect.y = event.motion.y - (dragging_thing->rect.h / 2); + if (dragging_thing->can_be_dropped_onto) { + thing = FindThingAtPoint(event.motion.x, event.motion.y); + if (thing) { + int i; + for (i = 0; dragging_thing->can_be_dropped_onto[i]; i++) { + if (dragging_thing->can_be_dropped_onto[i] == thing->what) { + droppable_highlighted_thing = thing; + break; + } + } + } + } + } + break; + + case SDL_EVENT_MOUSE_BUTTON_DOWN: + thing = UpdateMouseOver(event.button.x, event.button.y); + break; + + case SDL_EVENT_MOUSE_BUTTON_UP: + if (dragging_button == event.button.button) { + Thing *dropped_thing = dragging_thing; + dragging_thing = NULL; + dragging_button = -1; + if (dropped_thing && dropped_thing->ondrop) { + dropped_thing->ondrop(dropped_thing, event.button.button, event.button.x, event.button.y); + } + droppable_highlighted_thing = NULL; + } + thing = UpdateMouseOver(event.button.x, event.button.y); + break; + + case SDL_EVENT_MOUSE_WHEEL: + UpdateMouseOver(event.wheel.mouseX, event.wheel.mouseY); + break; + + case SDL_EVENT_DROP_FILE: + SDL_Log("Drop file! '%s'", event.drop.file); + LoadWavThing(event.drop.file, event.drop.x, event.drop.y); + /* SDLTest_CommonEvent will free the string, below. */ + break; + + case SDL_EVENT_WINDOW_RESIZED: + WindowResized(event.window.data1, event.window.data2); + break; + + case SDL_EVENT_AUDIO_DEVICE_ADDED: + CreatePhysicalDeviceThing(event.adevice.which, event.adevice.iscapture); + break; + + case SDL_EVENT_AUDIO_DEVICE_REMOVED: { + const SDL_AudioDeviceID which = event.adevice.which; + Thing *i, *next; + SDL_Log("Removing audio device %u", (unsigned int) which); + for (i = things; i != NULL; i = next) { + next = i->next; + if (((i->what == THING_PHYSDEV) || (i->what == THING_PHYSDEV_CAPTURE)) && (i->data.physdev.devid == which)) { + TrashThing(i); + next = things; /* in case we mangled the list. */ + } else if (((i->what == THING_LOGDEV) || (i->what == THING_LOGDEV_CAPTURE)) && (i->data.logdev.devid == which)) { + TrashThing(i); + next = things; /* in case we mangled the list. */ + } + } + break; + } + + default: break; + } + + SDLTest_CommonEvent(state, &event, &done); + } + + TickThings(); + Draw(); + + if (!saw_event) { + SDL_Delay(10); + } + + #ifdef __EMSCRIPTEN__ + if (done) { + emscripten_cancel_main_loop(); + } + #endif +} + +int main(int argc, char *argv[]) +{ + int i; + + state = SDLTest_CommonCreateState(argv, SDL_INIT_VIDEO | SDL_INIT_AUDIO); + if (state == NULL) { + Quit(1); + } + + state->window_flags |= SDL_WINDOW_RESIZABLE; + + for (i = 1; i < argc;) { + int consumed = SDLTest_CommonArg(state, i); + if (consumed == 0) { + consumed = -1; + /* add our own command lines here. */ + } + if (consumed < 0) { + static const char *options[] = { + /* add our own command lines here. */ + /*"[--blend none|blend|add|mod|mul|sub]",*/ + NULL + }; + SDLTest_CommonLogUsage(state, argv[0], options); + Quit(1); + } + i += consumed; + } + + if (!SDLTest_CommonInit(state)) { + Quit(2); + } + + SetDefaultTitleBar(); + + physdev_texture = CreateTexture("physaudiodev.bmp"); + logdev_texture = CreateTexture("logaudiodev.bmp"); + audio_texture = CreateTexture("audiofile.bmp"); + trashcan_texture = CreateTexture("trashcan.bmp"); + soundboard_texture = CreateTexture("soundboard.bmp"); + soundboard_levels_texture = CreateTexture("soundboard_levels.bmp"); + + LoadStockWavThings(); + CreateTrashcanThing(); + CreateDefaultPhysicalDevice(SDL_FALSE); + CreateDefaultPhysicalDevice(SDL_TRUE); + +#ifdef __EMSCRIPTEN__ + emscripten_set_main_loop(Loop, 0, 1); +#else + while (!done) { + Loop(); + } +#endif + + Quit(0); + return 0; +} + diff --git a/test/trashcan.bmp b/test/trashcan.bmp new file mode 100644 index 0000000000000000000000000000000000000000..64a60b22ebcc0da79d0922fe468fe920cfd15cf6 GIT binary patch literal 65674 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 F{x=oGqjCTM literal 0 HcmV?d00001