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

1

13.07.2010, 21:18

FMOD Lautstärkenregelung

Hey !
Ich wollte meinem Spiel gerade eine Hintergrundmusik beifügen, und habe dabei ein kleines Problem.

Sobald irgendein anderer Sound abgespielt wird, wird die Hintergrundmusik leiser und wenn man z.B. den Schuss öfter hintereinander abfeuert, höhrt man die Hintergrundmusik gar nicht mehr und sie wird erst danach wieder "Raufgedreht".
Raufgedreht, weil es wirklich wie ein "fade in" klingt, also lauter wird.

Ich habe schon versucht, die anderen Channel (bis auf den der Hintergrundmusik) per setVolume leiser zu stellen, hatte aber keine Wirkung.

In den FMOD_MODE Parameter bei der erzeugung des Sounds (createStream) habe ich auch nichts entsprechendes gefunden, was das behebt. Ich habe auch versucht, es mit den FMOD_MODE Parameter über die Funktion setMode, den Channel zu sagen, dass er nicht "runterdrehen soll", aber ohne erfolg.

Hoffe Ihr könnt mir helfen :)

Liebe Grüße,
Ombalat

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

2

13.07.2010, 22:39

Ich kann mich an keine Probleme dieser Art erinnern und ich habe FMod schon oefter in verschiedenen Projekten benutzt. Hast du das Problem auch in den Beispielprogrammen, die dabei sind? Was ist wenn du die Musik mit einem zweiten Programm abspielst?

3

14.07.2010, 08:43

Bei den Beispielprogrammen hatte ich das Problem eben nicht.
Ich hatte anfangs eine Klasse dafür geschrieben, die ich z.Z. versuche zu überarbeiten ;)
In meiner Klasse hatte ich aber für jedes objekt ein eigenes System, einen eigenen Channel, und einen eigenen Sound.
Am Anfang hab ich gedacht, dass es daran liegt, dass ich für jedes Objekt ein eigenes System erzeuge, und habe deshalb ein Testprogramm geschrieben, in dem ich drei Sounds mit Tasteneingaben beliebig abspielen können, und alle im selben System sind.


Vielleicht hab ich ja irgend einen Fehler bei meinem Beispiel, weshalb es nicht so läuft, wie ich es mir wünsche.
Hier mal mein beispielprogramm.
(Die Auskommentierten Sachen sind noch vom Test meiner Klasse)

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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
#include <iostream>
#include<conio.h>
#include "Sound.hpp"

using namespace std;

//Funktion zur Fehler - Überprüfung
void ERRCHECK(FMOD_RESULT result)
{
    if (result != FMOD_OK)
    {
        printf("FMOD error! (%d) %s\n", result, FMOD_ErrorString(result));
        exit(-1);
    }
}

int main()
{
    /*int auswahl = 0;

    CSound Sound1;
    CSound Sound2;
    CSound Sound3;

    Sound1.Load("Music/01.mp3",false);
    Sound1.Play();

    Sound2.Load("Sound/01.sound",false);
    Sound2.Play();
    Sound2.Pause_Unpause();

    Sound3.Load("Sound/02.sound",false);
    Sound3.Play();
    Sound3.Pause_Unpause();
    */
    
    FMOD::System    *m_pSystem;
    FMOD::Sound     *m_pSound,*m_pSound2,*m_pSound3;
    FMOD::Channel   *m_pChannel[100];
    FMOD_RESULT     m_result;
    unsigned int    m_version;

    m_result = FMOD::System_Create(&m_pSystem); //System erzeugen
    ERRCHECK(m_result);

    m_result = m_pSystem->getVersion(&m_version); //System Version abfragen
    ERRCHECK(m_result);

    if (m_version < FMOD_VERSION) //Version überprüfen
    {
        printf("Error!  You are using an old version of FMOD %08x.  This program requires %08x\n", m_version, FMOD_VERSION);
    }
    else
    {
        m_result = m_pSystem->init(100, FMOD_INIT_NORMAL, 0); //System initialisieren
        ERRCHECK(m_result);

        //Sounddatei erzeuegn
        m_result = m_pSystem->createStream("Music/01.mp3", FMOD_HARDWARE | FMOD_LOOP_OFF | FMOD_2D, 0, &m_pSound);
        ERRCHECK(m_result);
        m_result = m_pSystem->createStream("Sound/01.sound", FMOD_HARDWARE | FMOD_LOOP_OFF | FMOD_2D, 0, &m_pSound2);
        ERRCHECK(m_result);
        m_result = m_pSystem->createStream("Sound/02.sound", FMOD_HARDWARE | FMOD_LOOP_OFF | FMOD_2D, 0, &m_pSound3);
        ERRCHECK(m_result);
    }

    //Sound abspielen
    m_result = m_pSystem->playSound(FMOD_CHANNEL_FREE, m_pSound, false, &m_pChannel[0]);
    ERRCHECK(m_result);
    m_result = m_pSystem->playSound(FMOD_CHANNEL_FREE, m_pSound2, false, &m_pChannel[1]);
    ERRCHECK(m_result);
    m_result = m_pSystem->playSound(FMOD_CHANNEL_FREE, m_pSound3, false, &m_pChannel[2]);
    ERRCHECK(m_result);

    m_pSystem->update();


    /**********************************************************************/
    cout << endl;
    cout << "\t ------------------------------------------------------ " << endl;
    cout << "\t| 'ESC' zum verlassen                                |" << endl;
    cout << "\t| '1' zum Abspielen und Pausieren der Hintergrundmusik |" << endl;
    cout << "\t| '2' zum Abspielen des Schusses                     |" << endl;
    cout << "\t| '3' zum Abspielen der Explosion                    |" << endl;
    cout << "\t| '4' zum Resetten der Hintergrundmusik              |" << endl;
    cout << "\t| '5' zum Resetten des Schussen                      |" << endl;
    cout << "\t| '6' zum Resetten der Explosion                     |" << endl;
    cout << "\t ------------------------------------------------------ " << endl;
    /**********************************************************************/

    //m_pChannel[1] -> setVolume(0.5); Das war mein Versuch, es mit der setVolume zu beheben
    //m_pChannel[2] -> setVolume(0.5);

    int auswahl = 0;
    do
    {
        if(kbhit())
        {
            auswahl = getch();

            switch(auswahl)
            {
                case '1':
                    {
                        bool paused;
                        m_pChannel[0]->getPaused(&paused);
                        m_pChannel[0]->setPaused(!paused);

                        //Sound1.Pause_Unpause();
                    }break;
                case '4':
                    {
                        m_result = m_pSystem->playSound(FMOD_CHANNEL_FREE, m_pSound, false, &m_pChannel[0]);
                        ERRCHECK(m_result);

                        m_pSystem->update();

                        //Sound1.Play();
                    }break;
                case '2':
                    {
                         bool paused;
                         m_pChannel[1]->getPaused(&paused);
                         m_pChannel[1]->setPaused(!paused);

                        //Sound2.Pause_Unpause();
                    }break;
                case '5':
                    {
                         m_result = m_pSystem->playSound(FMOD_CHANNEL_FREE, m_pSound2, false, &m_pChannel[1]);
                         ERRCHECK(m_result);
                            
                         m_pSystem->update();

                        //Sound2.Play();
                    }break;
                case '3':
                    {
                         bool paused;
                         m_pChannel[2]->getPaused(&paused);
                         m_pChannel[2]->setPaused(!paused);

                        //Sound3.Pause_Unpause();
                    }break;
                case '6':
                    {
                        m_result = m_pSystem->playSound(FMOD_CHANNEL_FREE, m_pSound3, false, &m_pChannel[2]);
                        ERRCHECK(m_result);
                            
                        m_pSystem->update();

                        //Sound3.Play();
                    }break;
            }
        }
    }while(auswahl != 27);

    //Sound1.Quit();
    //Sound2.Quit();
    //Sound3.Quit();

    //Alle Systeme beenden
    m_result = m_pSound->release();
    ERRCHECK(m_result);
    m_result = m_pSound2->release();
    ERRCHECK(m_result);
    m_result = m_pSound3->release();
    ERRCHECK(m_result);
    m_result = m_pSystem->close();
    ERRCHECK(m_result);
    m_result = m_pSystem->release();
    ERRCHECK(m_result);
}


Liebe Grüße

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

4

14.07.2010, 09:42

Dann machst du definitiv was falsch in deinem Programm.

Wieso benutzt du nur Streams? Ist das in den neuen FMod Versionen so ueblich? Machen das die Beispiele auch so? Falls dir das hilft, lade dir doch mal meinen SnakeZ Sourcecode runter, das benutzt FMod und hat das auch in eine Helperklasse abstrahiert. Ich hatte das Problem da nie.

5

14.07.2010, 09:44

Bist du dir sicher dass es nicht an deinen Lautsprechern oder an irgendwelchen Equalizer-Einstellungen liegt? Könntest ja mal ein Testprojekt hochladen, wo der Fehler auftritt.
Ich hatte solche Probleme nie mit FMOD.

Edit:

Zitat von »TGCC«

Wieso benutzt du nur Streams? Ist das in den neuen FMod Versionen so ueblich?
Nein, ist nicht so üblich. Frag ich mich auch wieso Ombalat das so macht. Streams sollte man schon nur bei großen Sound-Dateien verwenden...
stɪl traɪ tuː θɪŋk ˈpɒzətɪv

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

6

14.07.2010, 09:56

Bist du dir sicher dass es nicht an deinen Lautsprechern oder an irgendwelchen Equalizer-Einstellungen liegt?
Muesste es dann in den Beispielprogrammen auch zu diesen Fehlern kommen?

7

14.07.2010, 10:18

Hey, danke schon mal für die vielen Antworten :)

Ich hab mich für Streams entschieden, weil ich mir einbilde, in der Doku mal gelesen zu haben, dass die schneller Arbeiten.
Wenn ich mich nicht irre ist das das selbe wie eine CreateSound, nur dass bei createStream der Sound gebuffert wird und während dem Abspielen den Sound lädt, weshalb die Streams u.A. für große Sounddatein geeignet sind.

Ich hab mir daher gedacht, dass es prinzipiell egal ist, ob man createStream oder createSound nimmt, weil dass doch eh das gleiche ist, nur eben schneller.

Kann aber auch sein, dass ich da was falsch Verstanden hatte :rolleyes:

Dass es an meinem Equalizer oder Boxen liegt, glaube ich nicht.
Mein Equalizer ist nur so eingestellt, dass man den Bass besser hört, und meine Boxen sind neu (is n Lautsprechersystem).

@TGGC:
Ich würde gerne dein Angebot annehmen und mir den Source - Code von deinem SnakeZ anschauen ...
Sag mir bitte, wie ich zu den Download komme :)

Libe Grüße
Ombalat

Edit:

Zitat

Wieso benutzt du nur Streams? Ist das in den neuen FMod Versionen so ueblich? Machen das die Beispiele auch so?
Bei den anderen Beispielen kommen beide Varianten vor ... Ich hab mir damals aber speziell das Beispiel zu VreateStream angeschaut, aus oben schon genannten gründen

8

14.07.2010, 10:22

Zitat von »Ombalat«

Mein Equalizer ist nur so eingestellt, dass man den Bass besser hört, und meine Boxen sind neu (is n Lautsprechersystem).
Hehe, und genau das sind die typischen Folgen. ^^
Das ist mir auch schon öfters bei meinem MP3-Player aufgefallen. Starte mal am besten einen Track und schraub die Bässe beim Equalizer höher, dann merkst du's!
stɪl traɪ tuː θɪŋk ˈpɒzətɪv

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

9

14.07.2010, 10:34

Japp, gibt schon viele Geraete, die das dermassen verpeilen, wenn man etwas weiter aufdreht. Die haben dann halt schon bei einem mittellauten Sound ihr maximale Leistungsabgabe erreicht, und wenn zwei mittellaute Geraeusche gemischt werden, dann geht es einfach nicht mehr lauter und es wird beides zu leise abgespielt. Das ist das Problem mit den ganzen Peak Leistungen heutzutage. Das ist Augenwischerei un ueberschaetzt die Anlagen meist um mehr als das 10fache.

@ Ombalat: Wenn du einfach auf meine HP gehst, dann Coding/Spiele, da findet man es:
http://games-net.de/hosted/tggc/index.php?cat=5&page=2

10

14.07.2010, 11:12

Vielen Dankt für eure Hilfe :D

Ich habs mal parallel ohne equalizer probiert ... Klingt dann zwar alles etwas dumpf, aber er ist wirklich nicht mehr so "abwürgend".
Iwie doof, dass das nicht gscheit funkt ^^

Danke auch für den Link ... wer trotzdem mal reinschaun :)

Ich hätt noch eine Frage:
Soll ich jetzt einfach meine alte Klasse verwendet, wo jedes Objekt ein eigenes System und alles hat.
Oder soll ich es so ändern, dass in meiner Klasse alle Sounds usw gespeichert sind und es nur ein System hat?
So dass ich quasy meine Klasse nur einmal im Programm habe und dann meine Sounds alle in einer Instanz von der Soundkasse habe.

Werbeanzeige