[GELÖST] Musikausgabe mit SDL_mixer scheitert



  • Ich möchte in einem Programm mithilfe von SDL_mixer Musik und Soundeffekte ausgeben lassen. Dazu habe ich folgenden Code (auf das Wichtigste gekürzt):

    main.cpp

    #include "data/supermain.h" // Header-Dateien, Basisfunktionen, etc.
    
    // start of the program
    int main(int argc, char* args[])
    {
        //CODE
    
        //---initialize SDL---
        test = initialize_SDL();
    
        //CODE
    
        while ( isRunning )
        {
            //CODE
    
            if ( sceneType == "menu" )
            {
                scene.menu(event);
            } else  if ( sceneType == "preScene" ) {
                scene.preScene(event);
            } else {
                isRunning = false;
                cout << "Internal Error! Programm has been closed!" << endl;
            }
    
            //CODE
        }
    }
    

    supermain.h

    // specific headers
    #include "SDL/SDL.h"        // domain SDL function
    #include "SDL/SDL_opengl.h" // OpenGl commands
    #include "SDL/SDL_image.h"  // SDL_image functions
    #include "SDL/SDL_mixer.h"  // SDL_mixer
    #include <iostream>
    #include <string>
    #include <sstream> 
    
    using namespace std;
    
    // externe Klassen und Funtkionen
    #include "additional/event.h"     // Events
    #include "scene.h"  // Scene-Klasse
    
    #ifndef TIMER_H     // Timer-Klasse
    #define TIMER_H
    #include "additional/timer.h"
    #endif
    
    //------------------//
    //----Variablen-----//
    //------------------//
    
    // Konstanten
    #ifndef CONSTANTS_H     // Konstanten
    #define CONSTANTS_H 1
    #include "constants.h"
    #endif
    
    //------------------//
    // SDL-Initialation //
    //------------------//
    inline bool initialize_SDL()
    {
        //CODE
    
        //Initialize SDL_mixer
        /*int flags=MIX_INIT_OGG|MIX_INIT_MOD;
        int initted=Mix_Init(flags);
        if(initted&flags != flags) {
            printf("Mix_Init: Failed to init required ogg and mod support!\n");
            printf("Mix_Init: %s\n", Mix_GetError());
            // handle error
        }*/
    
        if ( Mix_OpenAudio( 22050, MIX_DEFAULT_FORMAT, 2, 4096 ) == -1 )
        {
            return false;
        }
    
        std::cout << "OpenGL is running \n";
    
        return true;
    }
    

    scene.cpp

    #include "scene.h"      // Header
    
    #ifndef RENDER_H        //Render-Funktionen
    #define RENDER_H
    #include "additional/render.h"
    #endif
    
    #include "additional/event.h"       // Events
    #include "additional/logic.h"
    
    //CODE
    
    bool Scene::menu(SDL_Event event)
    {
    
        if (!texLoaded_)
        {
            std::cout << "Create Scene Menu!" << std::endl;
    
            //MUSIC
            music_ = Mix_LoadMUS( ".music/Words.mp3" );
            Mix_VolumeMusic(128);
            if ( music_ != NULL )
            {
                std::cout << "Music loaded successfully!" << std::endl;
            } else {
                std::cout << "Loding Music failed!" << std::endl;
            }
    
            //SOUNDS
    
            //RUNTIME VARIABLES
            index_ = 0;
            counter_ = 0;
    
            //COMMANDS
            if ( Mix_PlayMusic(music_,-1) != -1 )
            {
                std::cout << "Music started successfully!" << std::endl;
            } else {
                std::cout << "Playing Music failed!" << std::endl;
            }
    
            texLoaded_ = true;
            std::cout << "Scene Menu Created!" << std::endl;
        }
    
        //CODE
    }
    

    Das Problem hierbei ist, dass keine Musik spielt, aber auch keinerlei Fehlermeldungen im Compiler oder beim Ausführen im Terminal (z.B. "Playing Music failed!") auftauchen. Der Debugger weist auch auf keinen Fehler hin.

    Der Auskommentierte Teil in de supermain.h hingegen

    int flags=MIX_INIT_OGG|MIX_INIT_MP3;
    int initted=Mix_Init(flags);
    if(initted&flags != flags) {
        printf("Mix_Init: Failed to init required ogg and mod support!\n");
        printf("Mix_Init: %s\n", Mix_GetError());
        // handle error
    

    sorgt, wenn er nicht auskommentiert ist, für folgende Fehlermeldung im Compiler g++:

    data/supermain.h:76: error: ‘MIX_INIT_OGG’ was not declared in this scope
    data/supermain.h:76: error: ‘MIX_INIT_MP3’ was not declared in this scope
    data/supermain.h:77: error: ‘Mix_Init’ was not declared in this scope

    Allerdings weiß ich auch nicht, ob dieser Code-Teil dringend benötigt wird, um die MP3 abzuspielen. Er stammt aus der Dokumentation zu SDL_mixer.

    Ich bitte um Hilfe.

    Mit freundlichen Grüßen,
    Ki



  • Ich würde mal ganz grob vermuten, das du zum verwenden von SDL_mixer das auch initialisieren musst. Wenn du die initialisierung

    Mix_Init(flags);
    

    einfach auskommentierst, ist es nicht unbedingt überraschend, dass es nicht geht.
    Ein SDL_InitSubSystem fehlt bei dir, ob es unbedingt notwendig wäre, weiß ich allerdings nicht.

    Ich hab mir "meinen" SDL_mixer header mal angesehen, da gibt es keine funktion Mix_Init, genausowenig die zugehörigen flags. Eventuell haben wir beide eine andere version als die doku da verwendet. Auf jedenfall reicht bei mir ein

    SDL_InitSubSystem(SDL_INIT_AUDIO);
    

    für die initialisierung. Wobei ich den entsprechenden code nicht selbst geschrieben hab, also ka was da genauer dahintersteckt...

    Aber davon abgesehen, was soll das für einen zweck haben?

    #ifndef TIMER_H     // Timer-Klasse
    #define TIMER_H
    #include "additional/timer.h"
    #endif
    

    Richtige include guards sehen anders aus!



  • SDL_INIT_AUDIO müsste eigentlich die Standard-Audiobibliothek von SDL sein, die schon bei

    SDL_Init(SDL_INIT_EVERYTHING);
    

    initialisiert wird.

    Zumindest ändert es nichts daran, dass die Musik nicht abgespielt wird.

    Ich verwende die Version 1.2.8-6build1 und verwende als Referenz diese Dokumentation:
    http://www.libsdl.org/projects/SDL_mixer/docs/SDL_mixer_frame.html

    EDIT:
    Nehme ich stattdessen eine WAV-Datei, so wird diese abgespielt. Es muss also scheinbar am Mix_Init() liegen.



  • http://ubuntuforums.org/showthread.php?p=8726573

    I just noticed that on my Ubuntu 9.10 system, the SDL 1.2.8 version of SDL_mixer does not define Mix_Init() or Mix_Quit(). However with SDL 1.2.10, it does. Here's the SDL_mixer.h header file with version 1.2.10:

    =>1.2.10 verwenden

    Und bin ich blind, oder wo is in dem gepostet code

    SDL_Init(SDL_INIT_EVERYTHING);
    

    ? oO (wenn dus nur nicht mitgepostet hast, ja SDL_INIT_EVERYTHING enthält auch SDL_INIT_AUDIO)



  • KTM schrieb:

    Und bin ich blind, oder wo is in dem gepostet code

    SDL_Init(SDL_INIT_EVERYTHING);
    

    ? oO (wenn dus nur nicht mitgepostet hast, ja SDL_INIT_EVERYTHING enthält auch SDL_INIT_AUDIO)

    Habe ich nicht vorher mitgepostet, da ich es für überflüssig hielt.

    Auf die Header-Datei der Version 1.2.10 bin ich mittlerweile auch schon gestoßen. Ubuntu scheint die entsprechenden Pakete nicht aktuell zu halten.

    Allerdings scheint das Ersetzen der Header-Datei allein nicht auszureichen. Ich erhalte folgende Fehlermeldung vom Compiler:

    main.cpp:(.text._Z14initialize_SDLv[initialize_SDL()]+0x120): undefined reference to `Mix_Init'



  • Auch die library, und nicht nur den header aktualisiert? Brauchst dann natürlich auch (btw, es gibt sogar schon 1.2.11)



  • KTM schrieb:

    Auch die library, und nicht nur den header aktualisiert? Brauchst dann natürlich auch (btw, es gibt sogar schon 1.2.11)

    Beim ersten Versuch, 1.2.11 zu installieren, habe ich mir SDL_mixer komplett zerschossen.
    Da du mich nun noch einmal darauf hingewiesen hast, habe ich es auch noch einmal probiert und erstaunlicherweise sogar erfolgreich. Die MP3-Datei wird dennoch weiterhin ohne Fehlermeldung nicht abgespielt.

    EDIT:

    Dateien vom Typ .wav und .ogg werden abgespielt. Es wäre zwar kein Problem die Dateien in .ogg zu konvertieren, aber MP3-Dateien wären mir bei der Musik eigentlich lieber.



  • Muss leider sagen, ich habs fast befürchtet, weil ich nach lesen der SDL_mixer changelogs festgestellt habe, das Mix_Init in 1.2.8 nicht vorhanden war, weil es nicht gebraucht wurde (die dlls wurden automatisch geladen/entladen, die Änderung war dazu da das ständige laden/entladen zu umgehen)
    Daran lags also schonmal nicht 😕

    Falls es nicht nur keine Fehlermeldungen gibt, sondern auch "Music loaded successfully!" und "Music started successfully!" kommt, gehen mir jetzt zugegenermaßen langsam die ideen aus...

    Mal ne blöde Frage, hast du verschiedene mp3s probiert? When SDL mixer sagt bei ihm läuft alles korrekt, vielleicht gibts ein problem mit der Lautstärke (wobei 128 ja MIX_MAX_VOLUME ist) oder dem mp3 an sich. Wenn es mit KEINER mp3 geht, kann ich dir fürcht ich auch nicht mehr helfen... sorry.



  • Ich habe die Words.mp3 mal durch den Exporter von Audacity gejagt und nun wird sie abgespielt. Es lag letzten Endes wohl wirklich an der Datei.

    Danke, du hast mir sehr geholfen. 🙂



  • \o/
    Immer gerne 🙂


Anmelden zum Antworten