Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

C0dR

Frischling

  • »C0dR« ist der Autor dieses Themas
  • Private Nachricht senden

1

25.11.2009, 02:17

SDL_Mixer Audio-Klassen problem

Hallo leute.

Bin durch zufall auf das Forum hier gestoßen und habe gesehen dass hier doch einige gute Leute sind ^^

Und zwar habe ich ein Problem. Ich will mit SDL_Mixer eine art Sound-Klasse schreiben. Soweit auch alles gemacht, aber jedes mal wenn ich das Ding öffne, schmiert es einfach ab und meint innerhalb des Mix_Chunk structs, "Fehler: Ausdruck kann nicht ausgewertet werden".
Eingebunden hab ich alles was an SDL benötigt wird. Initialisiert wird auch alles.
Ich weis einfach nicht mehr weiter, habe schon alles mögliche ausprobiert. Vielleicht weis einer von euch eine Lösung.

Hier meine Audio-Header:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#ifdef WIN32
#pragma comment(lib, "SDL_Mixer.lib")
#pragma comment(lib, "SDL.lib")
#pragma comment(lib, "SDLmain.lib")
#endif

#include <iostream>
#include "SDL_mixer.h"
#include <vector>

class Audio{

private:
    int audio_rate;
    Uint16 audio_format; /* 16-bit stereo */
    int audio_channels;
    int audio_buffers;
    std::string Filename;
    
    struct Sound{
        Mix_Chunk *soundObj;
        int id;
        int volume;
    };
    Sound *snd;
    std::vector<Sound> sound;
    


public:
    
    //Inits:

    void init();
    void init(int pAudio_rate, Uint16 pAudio_format, int pAudio_channels, int pAudio_buffers);

    //SoundControl:

    void loadSound(std::string pFilename, int ID);
    void playSound(int pID, int pLoop);
    void stopSound(int pID);
    void pauseSound(int pID);
    int soundIsPaused(int pID);
    int getChannel(int pID);

    //volumeControl:

    void setVolume(int pID, int pVolume);
    //int getVolume();


    //Desctructor:

    ~Audio();
};


und hier meine cpp-Datei:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include "audio.h"
#include <iostream>

void Audio::init(){
    /* We're going to be requesting certain things from our audio
     device, so we set them up beforehand */
     audio_rate = 44100;
     audio_format = MIX_DEFAULT_FORMAT; /* 16-bit stereo */
     audio_channels = 2;
     audio_buffers = 4096;
    
#ifdef WIN32
    Mix_Init(MIX_INIT_MP3 | MIX_INIT_OGG);
#endif
     if(Mix_OpenAudio(audio_rate, audio_format, audio_channels, audio_buffers) != 0) {
            printf("Unable to initialize audio: %s\n", Mix_GetError());
        exit(1);
    }
     //snd = new Sound();

}
void Audio::init(int pAudio_rate, Uint16 pAudio_format, int pAudio_channels, int pAudio_buffers){
        audio_rate = pAudio_rate;
        audio_format = pAudio_format; /* 16-bit stereo */
        audio_channels = pAudio_channels;
        audio_buffers = pAudio_buffers;
    
        Mix_Init(MIX_INIT_MP3 | MIX_INIT_OGG);
     if(Mix_OpenAudio(audio_rate, audio_format, audio_channels, audio_buffers)) {
        printf("Fehler beim öffnen der Audio-Datei!\n");
        exit(1);
    }
     Mix_QuerySpec(&audio_rate, &audio_format, &audio_channels);
}

void Audio::loadSound(std::string pFilename, int pID){
    //Loading in new vector:

    sound.push_back(*snd);
    sound[sound.size()].soundObj = Mix_LoadWAV(pFilename.c_str());
    sound[sound.size()].id = pID;
    sound[sound.size()].volume = 100;
}


//Sound Controls

void Audio::playSound(int pID, int pLoop){
    //Search for right Sound struct and Play it:

    for(unsigned int i=0;i < sound.size();i++){
        if(sound[i].id = pID)
            Mix_PlayChannel(sound[i].id, sound[i].soundObj, pLoop);
    }
}

void Audio::stopSound(int pID){
    for(unsigned int i=0;i < sound.size();i++){
        if(sound[i].id = pID)
            Mix_HaltChannel(sound[i].id);
    }
}

void Audio::pauseSound(int pID){
    for(unsigned int i=0;i < sound.size();i++){
        if(sound[i].id = pID)
            Mix_Pause(sound[i].id);
    }
}

int Audio::getChannel(int pID){
    for(unsigned int i=0;i < sound.size();i++){
        if(sound[i].id = pID)
            return sound[i].id;
        else
            return 0;
    }
}

int Audio::soundIsPaused(int pID){
    for(unsigned int i=0;i < sound.size();i++){
        if(sound[i].id = pID)
            return Mix_Paused(sound[i].id);
        else
            return 0;
    }
}

//Volume Control:

void Audio::setVolume(int pID, int pVolume){
    int rightID = 0;
    for(unsigned int i=0;i < sound.size();i++){
        if(sound[i].id = pID)
            rightID = sound[i].id;
    }
            if(sound[rightID].volume < 0){
                sound[rightID].volume = 0;
                Mix_Volume(sound[rightID].id, sound[rightID].volume);
            }
            else
                Mix_Volume(sound[rightID].id, pVolume);
            
            if(sound[rightID].volume > 100){
                sound[rightID].volume = 100;
                Mix_Volume(sound[rightID].volume, sound[rightID].volume);
            }
            else
                Mix_Volume(sound[rightID].volume, pVolume);

}
/*
int Audio::getVolume(int ID){
    return volume;
}
*/

//Destructor:

Audio::~Audio(){
    for(unsigned int i=0;i < sound.size();i++){
        Mix_HaltChannel(sound[i].id);
        Mix_FreeChunk(sound[i].soundObj);
    }
    Mix_CloseAudio();
}

Hoffe mal ihr kommt mit meinem gekritzel klar :D

DANKE IM VORRAUS!

lg

CRSt

Frischling

Beiträge: 1

Wohnort: Lohmar

  • Private Nachricht senden

2

26.11.2009, 11:10

Hallo C0dR,
in deinem Quelltext kann ich auf anhieb keinen Fehler erkennen. Zufälligerweise habe ich mir gestern auch fast die Ohren am Thema SDL Sound gebrochen. :evil:

Folgendes Ergebnis läuft bei mir nun problemlos:

Header-Datei:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#ifndef SOUND_HPP
#define SOUND_HPP

#include <SDL_mixer.h>
#include <iostream>
using namespace std;

class CSound
{
public:
    CSound();
    ~CSound();

    void Load   (const string sFilename);
    void Play   ();

private:
    int audio_rate;
    Uint16 audio_format;
    int audio_channels;
    int audio_buffers;
    Mix_Chunk *sound;
};

#endif



Quellcode-Datei:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include "Sound.hpp"

// Konstruktor

CSound::CSound()
{
    // Einstellungen initialisieren

    audio_rate = 0;
    audio_format = 0;
    audio_channels = 0;
    audio_buffers = 0;
    Mix_Chunk *sound = NULL;
}

// Destruktor

CSound::~CSound()
{
    // Struktur freigeben

    Mix_FreeChunk(sound);
    // Audioausgabe schließen

    Mix_CloseAudio();
}

// Aufgabe: Sounddatei laden

void CSound::Load(const string sFilename)
{
     // Audio Einstellungen setzen

    audio_rate = 22050;
    audio_format = AUDIO_S16SYS;
    audio_channels = 2;
    audio_buffers = 4096;
    
    // Audioausgabe öffnen

    if(Mix_OpenAudio(audio_rate, audio_format, audio_channels, audio_buffers) != 0) 
        {
            cout << "Konnte Sound nicht starten: " << Mix_GetError() << endl;
        }
    
    // Sounddatei laden 

    sound = Mix_LoadWAV(sFilename.c_str());
    if(sound == NULL) 
        {
            cout << "Konne WAV File nicht laden: " << Mix_GetError() << endl;
        }
}

// Aufgabe: Sounddatei abspielen

void CSound::Play()
{
    // Sound abspielen

    if(Mix_PlayChannel(-1, sound, 0)==-1) 
        {
            cout << "Konnte WAV Datei nicht abspielen: " << Mix_GetError() << endl;
        }
}


Des weiteren hat mir folgender Beitrg bei obigem Ergebnis sehr geholfen:
https://www.spieleprogrammierer.de/phpBB2/viewtopic.php?t=11454

Beste Grüße;
CRSt

3

26.11.2009, 18:07

Hier in der Tut-Section hats auch nen Topic zu SDL_SOUND
https://www.spieleprogrammierer.de/phpBB…pic.php?t=11503

C0dR

Frischling

  • »C0dR« ist der Autor dieses Themas
  • Private Nachricht senden

4

27.11.2009, 01:49

ah ok. Ja dann muss ich wohl eine Extra "Sound_Manager" klasse erstellen. Wollte halt alles in einer Klasse, aber geht anscheinend nicht :/ Also, DANKE FÜR EURE HILFE :)

Werbeanzeige