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

Errschaffer

Alter Hase

  • »Errschaffer« ist der Autor dieses Themas

Beiträge: 865

Wohnort: Frankfurt

  • Private Nachricht senden

1

26.03.2009, 17:32

SDL Sound

Nach dem ich dem Spiel nun Lebensanzeige und ein Hauptmenü hinzugefügt habe wollte ich Sounds einbauen. Hab mir dazu einige Tutorials angeschaut und das auch erstmal so kopiert.

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
void CSound::Init (const string sFilename)
{

     SDL_AudioSpec    audio;    // Buffer für Audiodatei 


    // Ausfüllen 

    audio.channels    = 2;        
    audio.format    = AUDIO_S16;    
    audio.freq    = 44100;    
    audio.samples    = 1024;        
    audio.callback    = audio_msg;    

}
 

void CSound::audio_msg(void *userdata, Uint8 *stream, int len) 
{ 
 // Wenn kein Sound mehr, beenden 

    if(audio_len == 0) 
        return; 

    // Mixen 

    len = ( len > audio_len ? audio_len : len ); 
    SDL_MixAudio(stream, audio_pos, len, SDL_MIX_MAXVOLUME); 
    audio_pos += len; 
    audio_len -= len; 

} 



Dann folgte das:

Zitat

1>d:\porgrammieren\spiele\projekte\sdl_test\soruce\sound.cpp(25) : error C3867: "CSound::audio_msg": Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie "&CSound::audio_msg", um einen Zeiger auf den Member zu erstellen.
1>d:\porgrammieren\spiele\projekte\sdl_test\soruce\sound.cpp(25) : error C2440: '=': 'void (__thiscall CSound::* )(void *,Uint8 *,int)' kann nicht in 'void (__cdecl *)(void *,Uint8 *,int)' konvertiert werden


Ist aber in jedem Tutorial so gemacht wie hier. An welcher Stelle der Fehler ist ,ist mir klar aber wieso nun , nicht.

n0_0ne

1x Contest-Sieger

  • Private Nachricht senden

2

26.03.2009, 17:47

Ähhm, also von vorneherein, ich hab das mit dem Standard SDL Audiokram auch nicht hinbekommen, mit SDL_Mixer lib war es um einiges einfacher... aber ich verstehe auch deinen Code nicht, oder hast du da etliches gelöscht? Weil Init übergibst du einen Dateinamen, machst aber nie was damit, und unten arbeitest du mit audio_len, hast es aber nie deklariert/initialisiert?

Edit: in der 1. Fehlermeldung erkennt er anscheinend nicht, dass es sich um einen Funktionspointer handelt, ich dachte zwar, dass das eine gültige schreibweise dafür ist, aber mach doch einfach mal (wie er das schreibt) ein & vornedran.
Edit2: Beim zweiten Fehler hat er Möglicherweise Probleme damit, dass es sich um eine Methode einer Klasse handelt, versuch die einfach mal außerhalb der Klasse zu definieren... aber kA, obs was hilft, hab da echt noch zu wenig Ahnung :D Deshalb empfehle ich dir als Anfänger auch die SDL_Mixer lib.

Errschaffer

Alter Hase

  • »Errschaffer« ist der Autor dieses Themas

Beiträge: 865

Wohnort: Frankfurt

  • Private Nachricht senden

3

26.03.2009, 17:50

Die Variabeln sind in der Headerdatei. Und wieso weiter schreiben wenn nicht mal das funktioniert?^^

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

4

26.03.2009, 19:57

Was gibst du denn bei

C-/C++-Quelltext

1
if(audio_len == 0) 
zurück?
Ein Semikolon?;).

Anonymous

unregistriert

5

26.03.2009, 20:15

Nein, er beendet die Funktion. Eine sehr legitime und sehr elegante Möglichkeit.

Zum Topic: Das Problem ist non-static ;)

NicoWe

Treue Seele

Beiträge: 126

Wohnort: Bielefeld / NRW

  • Private Nachricht senden

6

26.03.2009, 20:18

für mich sieht das so aus als wolltest du einen funktiospointer auf eine Memberfunktion haben.
Dafür gibt es 2 lösungsmöglichkeiten: boost benutzen oder kapseln :)

erstes ist eleganter, wirst dich aber ein wenig mit boost auseinandersetzen müssen, letzteres ist einfacher xD
Erfolg ist die Fähigkeit, von einem Misserfolg zum anderen zu gehen,
ohne seine Begeisterung zu verlieren.
-Winston Churchill-

Errschaffer

Alter Hase

  • »Errschaffer« ist der Autor dieses Themas

Beiträge: 865

Wohnort: Frankfurt

  • Private Nachricht senden

7

26.03.2009, 21:03

Ich werds morgen mal mit SDL_Mixer probieren.

Toxic

Frischling

Beiträge: 53

Wohnort: Niedersachsen

Beruf: Ingenieur

  • Private Nachricht senden

8

26.03.2009, 21:16

Also ich muss ganz ehrlich sagen das ich auch nicht so ganz durch die Sache mit SDL_AUDIO durchsteige. Es ist wirklich schwer Quellen zu finden die auch ein paar Hintergründe erläutern :(

Aber ich habe ein bisschen was zusammengebastelt und es läuft :)
Bis auf einen kleinen Fehler...
Der Ton wird nur einmal abgespielt, obwohl das ganze wirklich mehrfach aufgerufen wird. Es ist auch egal von welcher Stelle aus dem Programm der Aufruf stattfindet...

Ich habe den Code aus dem SDL-Tutorial auf dieser Seite genommen und ihn ein bisschen passend gemacht. Klar so wie er jetzt ist, ist das ganz schlechter Programmiererstil, aber ist ja nur eine Testlösung :)

Ausserhalb diese Codes befindet sich lediglich in der Datei Game.hpp die Funktionsdeklaration int Sound(); und in Game.cpp wird diese an einer Stelle mit CGame::Sound(); aufgerufen.
Was ich ansonsten geändert habe steht als Kommentar im Code.

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
//Ist schon woanders 

//#include <SDL.h> 


Uint32    audio_len;    // Länge der Audiodatei

Uint8*    audio_pos;    // aktuelle Position


// Callbackfunktion

void audio_msg(void *pReserved, Uint8* stream, int len);

int CGame::Sound()
{
    SDL_AudioSpec    audio;    // Buffer für Audiodatei


    // leeren, da nicht alle Vaiablen gebraucht

    // error C3861 "ZeroMemory": Bezeichner wurde nicht gefunden 

    // ZeroMemory(&audio, sizeof(SDL_AudioSpec));


    //Mache ich lieber zentral in Framework.cpp mit den anderen zusammen

    //SDL_Init(SDL_INIT_AUDIO);

    
    // Ausfüllen

    audio.channels    = 2;        // Stereo = 2; Mono = 1

    audio.format    = AUDIO_S16;    // Format

    audio.freq    = 44100;    // 44 kHz

    audio.samples    = 1024;        // 1024 Samples (PCM)

    audio.callback    = audio_msg;    // Callback-Funktion

    

    // Audioschnittstelle öffnen

    if(SDL_OpenAudio(&audio, NULL) < 0)
    {
        // Fehlerbehandlung

        return 1;
    }

    // Audiodatei laden

    if(!SDL_LoadWAV("C:/WINDOWS/Media/Windows XP-Abmeldesound.wav", &audio, &audio_pos, &audio_len))
    {
        // Fehlerbehandlung

        return 1;
    }


    SDL_PauseAudio(0);

    //Soll nicht stoppen 

    //SDL_Delay(2000);// 2 Sekunden warten, da die Wavedatei nicht besonders lang

    
    //Auch in Framework.cpp

    //SDL_Quit(); 


    return 0;
} 

// Callbackfunktion

void audio_msg(void *pReserved, Uint8* stream, int len)
{
    // Wenn kein Sound mehr, beenden

    if(audio_len == 0)
        return;

    // Mixen

    len = ( len > audio_len ? audio_len : len );
    SDL_MixAudio(stream, audio_pos, len, SDL_MIX_MAXVOLUME);
    audio_pos += len;
    audio_len -= len;
    
} 


Eine Fehlermeldung wird so nicht direkt ausgegeben, jedoch bekomme ich eine Warnung:
warning C4018: '>': Konflikt zwischen 'signed' und 'unsigned'
Es handelt sich dabei um die leere Zeile nach dem return; in audio_msg.
Ob das nur einmalige ausgeben des Sounds mit dieser Warnung irgendwie zusammen hängt ?


Ich konnte den Fehler mit der einmaligen Ausgabe des Sounds auf jeden Fall etwas einkreisen, offensichtlich wird beim zweiten Aufruf von Sound() an dem Punkt wo die Audioschnittstelle kontrolliert wird das ganze abgebrochen (also < 0). Bis zu dieser Stelle wird jedenfalls mein Test-cout noch aufgerufen :)

C-/C++-Quelltext

1
2
3
4
5
6
7
// Audioschnittstelle öffnen

    if(SDL_OpenAudio(&audio, NULL) < 0)
    {
        // Fehlerbehandlung

        cout << audio_len<< endl; 
        return 1;
    }


Wäre cool wenn jemand mal Interesse hätte einen Blick drauf zu werfen.
Ich habe hier derzeit ein wenig das Gefühl mich im Kreis zu drehen, bzw. in eine Endlosschleife geraten zu sein :)
Wenn Architekten ihre Häuser so bauen würden wie Programmierer ihre Programme, könnte ein einziger Specht ganze Städte zerstören !

Errschaffer

Alter Hase

  • »Errschaffer« ist der Autor dieses Themas

Beiträge: 865

Wohnort: Frankfurt

  • Private Nachricht senden

9

27.03.2009, 18:14

Habs mit SDL_mixer gemacht und es geht endlich^^

Jetzt hat das Spiel ein Hauptmenü,Lebensanzeige und Sound hehe :lol:

Toxic

Frischling

Beiträge: 53

Wohnort: Niedersachsen

Beruf: Ingenieur

  • Private Nachricht senden

10

27.03.2009, 21:03

Meinst du, du könntest den Quellcode der dann letztlich bei dir funktioniert hat hier mal posten. Wäre nicht nur für mich sondern auch für die ,,Nachwelt" mit Sicherheit eine ziemliche Bereicherung :)
Wenn Architekten ihre Häuser so bauen würden wie Programmierer ihre Programme, könnte ein einziger Specht ganze Städte zerstören !

Werbeanzeige