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