#include #include #include #include #include #include #include ErrorContext *load_start_bgm(char *fname) { PREPARE_ERROR(errctx); string *tmpstr = NULL; MIX_Track *bgmtrack = NULL; SDL_PropertiesID bgmprops = 0; ATTEMPT { FAIL_ZERO_BREAK(errctx, fname, ERR_NULLPOINTER, "load_start_bgm received NULL filename"); CATCH(errctx, heap_next_string(&tmpstr)); CATCH(errctx, string_initialize(tmpstr, NULL)); SDL_snprintf((char *)&tmpstr->data, MAX_STRING_LENGTH, "%s%s", SDL_GetBasePath(), fname); SDL_Log("Loading music asset from %s", (char *)&tmpstr->data); bgm = MIX_LoadAudio(game.mixer, (char *)&tmpstr->data, true); FAIL_ZERO_BREAK(errctx, bgm, ERR_NULLPOINTER, "Failed to load music asset %s : %s", (char *)&tmpstr->data, SDL_GetError()); bgmtrack = MIX_CreateTrack(game.mixer); FAIL_ZERO_BREAK(errctx, bgmtrack, ERR_NULLPOINTER, "Failed to create audio track for background music: %s", SDL_GetError()); game.tracks[GAME_AUDIO_TRACK_BGM] = bgmtrack; FAIL_ZERO_BREAK( errctx, MIX_SetTrackAudio(bgmtrack, bgm), ERR_SDL, "%s", SDL_GetError()); SDL_SetNumberProperty(bgmprops, MIX_PROP_PLAY_LOOPS_NUMBER, -1); if (!MIX_PlayTrack(bgmtrack, bgmprops)) { FAIL_BREAK(errctx, ERR_SDL, "Failed to play music asset %s", fname); } } CLEANUP { IGNORE(heap_release_string(tmpstr)); if ( errctx != NULL ) { if ( errctx->status != 0 && bgm != NULL) { MIX_DestroyAudio(bgm); } } } PROCESS(errctx) { } FINISH(errctx, true); SUCCEED_RETURN(errctx); }