Du bist nicht angemeldet.

Werbeanzeige

1

02.07.2010, 19:14

FMOD Init - Problem

Hey,
Ich habe jetzt das Spiel von dem Buch C++ für Spieleprogrammierer fertig und jetzt fehlt mir nur noch der Sound dazu.

Ich habe mir dafür FMOD runtergeladen und versucht, das Example für die Sound - Wiedergabe in eine Klasse zu packen.

Allerdingst scheitert dieser Versuch bei FMOD_System_Init(). (Nach cout << 4 in der Sund.cpp)

Errormeldung in der Konsole:
FMD error! <37> An invalid parameter was passed to this Funktion.

Ich habe schon versucht, das zu beheben, doch habe ich es nicht hinbekommen.
Bitte um Hilfe !

Hier mein Quellcode:

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
Sound.hpp:

#ifndef SOUND_HPP
#define SOUND_HPP

#include <iostream>
#include <fmod.hpp> //Bilblitheks - Header

#include <fmod_errors.h> //Für die Eroor - Auswertung benötigt
#include <windows.h> //Für die Sleep - Funktion benötigt
#include <conio.h> //Für kbhit und getch benötogt

using namespace std; //Sonst wird const nicht erkannt

class CSound
{
public:
    bool Load(const string &sPath);
    void Quit();
    void Play_Pause();

private:
    void ERRORCHECK(FMOD_RESULT result);

    FMOD_SYSTEM     *system;
    FMOD_SOUND      *sound;
    FMOD_CHANNEL    *channel;
    FMOD_RESULT     result;
    unsigned int    version;
};

#endif

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
Sound.cpp:

#include "Sound.hpp"

//Funktion zum Laden einer Audio - Datei
bool CSound::Load(const string &sPath)
{
    channel = 0;
 
    result = FMOD_System_Create(&system); //System Erzeugen
    ERRORCHECK(result);

    result = FMOD_System_GetVersion(system, &version); //Die Version des FMOD - Systems hohlen
    ERRORCHECK(result);

    if (version < FMOD_VERSION) //VErsion überprüfen
    {
        printf("Error!  You are using an old version of FMOD x.  This program requires x\n", version, FMOD_VERSION);
        return false;
    }
    else
    {
    cout << "4\n";
        result = FMOD_System_Init(system, 1, FMOD_INIT_NORMAL, NULL); // FMOD - System initialisieren
        ERRORCHECK(result);

    cout << "5\n";

        //Erzeugen der Sounddatei
        result = FMOD_System_CreateStream(system, sPath.c_str(), FMOD_HARDWARE | FMOD_LOOP_NORMAL | FMOD_2D, 0, &sound);
        ERRORCHECK(result);

    cout << "6\n";

        return true;
    }
}

//Funktion zum schließen der Ausdiodatei
void CSound::Quit()
{
    //Beenden aller Systeme
    result = FMOD_Sound_Release(sound);
    ERRORCHECK(result);
    result = FMOD_System_Close(system);
    ERRORCHECK(result);
    result = FMOD_System_Release(system);
    ERRORCHECK(result);
}

//Funktion zum abspielen und pausieren der Sounds
void CSound::Play_Pause()
{
    //Sound abspielen
    result = FMOD_System_PlaySound(system, FMOD_CHANNEL_FREE, sound, 0, &channel);
    ERRORCHECK(result);

    //Zwischen Wiedergabe und Pause wechseln
    int paused;
    FMOD_Channel_GetPaused(channel,&paused);
    FMOD_Channel_SetPaused(channel,!paused);

    //Ausgabe der aktuellen Laufzeit der Audiodatei
    if (channel)
    {
        unsigned int ms;
        unsigned int lenms;
        int         playing;
        int         paused;

        result = FMOD_Channel_IsPlaying(channel, &playing);
        if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN))
        {
            ERRORCHECK(result);
        }

        result = FMOD_Channel_GetPaused(channel, &paused);
        if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN))
        {
            ERRORCHECK(result);
        }

        result = FMOD_Channel_GetPosition(channel, &ms, FMOD_TIMEUNIT_MS);
        if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN))
        {
            ERRORCHECK(result);
        }

        result = FMOD_Sound_GetLength(sound, &lenms, FMOD_TIMEUNIT_MS);
        if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN))
        {
            ERRORCHECK(result);
        }

        printf("Time d:d:d/d:d:d : %s\r", ms / 1000 / 60, ms / 1000 % 60, ms / 10 % 100, lenms / 1000 / 60, lenms / 1000 % 60, lenms / 10 % 100, paused ? "Paused " : playing ? "Playing" : "Stopped");
    }

    FMOD_System_Update(system); //System updaten  
}

//Funktion zur Fehler - Überprüfung
void CSound::ERRORCHECK(FMOD_RESULT result)
{
    if (result != FMOD_OK) // ÜBerprüfung des Systems
    {
        //Fehlerausgabe und Sound beenden
        printf("FMOD error! (%d) %s\n", result, FMOD_ErrorString(result));
        Quit();
        exit(-1);
    }
}

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
main.cpp:

#include "Sound.hpp"

int main (int argc, char *argv[])
{
    CSound Sound;
    Sound.Load("Sound/Ton.wav");
    
    //Sound.Play_Pause();

    //Sleep(3000);

    Sound.Quit();
}


Ich muss noch dazu sagen, dass ich FMOD zum ersten mal verwende, und noch kaum erfahrungen damit gemacht habe ... Ich hab mir den Beispielcode durchgeschaut, der dabei ist, und denke, dass ich den verstanden habe (Und ohne Klasse würde es auch funktionieren)

Mit freundlichen Grüßen
Ombalat

Edit: Und danke fürs lesen ... Ist doch mehr geworden, als ich dachte ;)

2

02.07.2010, 19:25

Aus welchem Grund brauchst du für jeden Sound ein eigenes FMOD_System?
Ich persönlich würde eine Audio-Klasse machen, die das System initialisiert. Wo du dann mit

C-/C++-Quelltext

1
Audio::Play(Sound&)
nen Sound abspielst.
stɪl traɪ tuː θɪŋk ˈpɒzətɪv

3

02.07.2010, 19:32

Für eine korrekte Initialisierung von FMOD schau dir das hier an.

Gruß
SaRu_

4

02.07.2010, 19:42

Aber nicht für jeden Sound. In dem Beispiel wird auch nur ein mal initialisiert.
So machs ich auch. ;)
fka tm

5

02.07.2010, 19:43

Die sichere Initialisierung in C, falls du mit GCC kompilierst:

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
    result = FMOD_System_Create(&system);
    ERRCHECK(result);
    
    result = FMOD_System_GetVersion(system, &version);
    ERRCHECK(result);

    if (version < FMOD_VERSION)
    {
        printf("Error!  You are using an old version of FMOD %08x.  This program requires %08x\n", version, FMOD_VERSION);
        return 0;
    }

    result = FMOD_System_GetNumDrivers(system, &numdrivers);
    ERRCHECK(result);

    if (numdrivers == 0)
    {
        result = FMOD_System_SetOutput(system, FMOD_OUTPUTTYPE_NOSOUND);
        ERRCHECK(result);
    }
    else
    {
        result = FMOD_System_GetDriverCaps(system, 0, &caps, 0, 0, &speakermode);
        ERRCHECK(result);

        result = FMOD_System_SetSpeakerMode(system, speakermode);       /* Set the user selected speaker mode. */
        ERRCHECK(result);

        if (caps & FMOD_CAPS_HARDWARE_EMULATED)             /* The user has the 'Acceleration' slider set to off!  This is really bad for latency!. */
        {                                                   /* You might want to warn the user about this. */
            result = FMOD_System_SetDSPBufferSize(system, 1024, 10);
            ERRCHECK(result);
        }

        result = FMOD_System_GetDriverInfo(system, 0, name, 256, 0);
        ERRCHECK(result);

        if (strstr(name, "SigmaTel"))   /* Sigmatel sound devices crackle for some reason if the format is PCM 16bit.  PCM floating point output seems to solve it. */
        {
            result = FMOD_System_SetSoftwareFormat(system, 48000, FMOD_SOUND_FORMAT_PCMFLOAT, 0,0, FMOD_DSP_RESAMPLER_LINEAR);
            ERRCHECK(result);
        }
    }

    result = FMOD_System_Init(system, 100, FMOD_INIT_NORMAL, 0);
    if (result == FMOD_ERR_OUTPUT_CREATEBUFFER)         /* Ok, the speaker mode selected isn't supported by this soundcard.  Switch it back to stereo... */
    {
        result = FMOD_System_SetSpeakerMode(system, FMOD_SPEAKERMODE_STEREO);
        ERRCHECK(result);
                
        result = FMOD_System_Init(system, 100, FMOD_INIT_NORMAL, 0);/* ... and re-init. */
        ERRCHECK(result);
    }
stɪl traɪ tuː θɪŋk ˈpɒzətɪv

6

02.07.2010, 20:11

So ... ich habe jetzt beide Mögligkeiten ausprobiert.

Leider funktioniert keine von beiden :(

Mit der ersten von SaRu bekomme ich dann den selben Fehler nur mit invalid Objekt Handle ...
Und bei dem Code von Wollnashorn stürtz das Programm nach dem Kompilieren einfach ab -.-

Edit: Wäre toll, wenn mir jemand seinen funktionierenden Quellcode geben könnte :whistling:

7

02.07.2010, 20:23

Funktionieren denn die Beispiele die mit der Library dabei waren bei dir? Und welchen Compiler nutzt du?
stɪl traɪ tuː θɪŋk ˈpɒzətɪv

8

02.07.2010, 22:37

Die Beispiele funktionieren, die bei der Libory dabei waren.

Ich verwende den Compiler, der bei Visual Studios dabei ist (Visual C++)

TGGC

1x Rätselkönig

Beiträge: 1 813

Beruf: Software Entwickler

  • Private Nachricht senden

9

02.07.2010, 23:10

Dann mache es so wie in den Beispielen oder in der Doku angegeben, das waere auch das logischste.

10

02.07.2010, 23:15

Wie ich schon gesagt habe, hab ich mein Programm aus dem Beispielprogramm übernommen ... Nur eben in eine Klasse geschrieben, dass ich öfter solche Sounds verwenden kann ^^

edit: Übernommen ist der falsche ausdruck ... ich hab mir meine Ideen, wie man das anwenden kann, aus dem Beispiel gehohlt

Werbeanzeige