Problem z biblioteką FMOD

0

Witam
Potrzebuję zrobić coś na kształt pianina na klawiaturze i używam do tego biblioteki fmod. Stworzyłem tablicę wskaźników do sound czyli klasy przechowującej dźwięk i do każdego załadowałem osobny dźwięk. Niestety przy próbie odtwarzania czyli funkcja playsound(..) wywala naruszenie ochrony pamięci. Jakieś pomysły?

 void Keyboard::play(){
    FMOD::System     *system;
    FMOD::Sound      *(sound[13]), *s;
    FMOD::Channel    *channel = 0;
    FMOD_RESULT       result;
    int               key;
    unsigned int      version;
    bool is_Playing=false;
    int prevKey=1;
    bool         paused = 0;
    result = FMOD::System_Create(&system);
    ERRCHECK(result);
    result = system->getVersion(&version);
    ERRCHECK(result);
    timeval           timer;
    double            t1, t2, t3;

    result = system->setOutput(FMOD_OUTPUTTYPE_ALSA);
    ERRCHECK(result);
    result = system->init(32, FMOD_INIT_NORMAL, 0);
    ERRCHECK(result);
    for(int i=0;i<12;i++){
        result = system->createSound((NoteBase[i]->getTitle()).c_str(), FMOD_SOFTWARE, 0, &(sound[i]));
        ERRCHECK(result);
       
    }
    gettimeofday(&timer, NULL);
    t1=timer.tv_sec+(timer.tv_usec/1000000.0);
    do
    {
        channel->isPlaying(&is_Playing);
        gettimeofday(&timer, NULL);
        t1=timer.tv_sec+(timer.tv_usec/1000000.0);

        if (kbhit())
        {
            key = getch();
            if(is_Playing and prevKey==key){
                result = channel->stop();
                continue;
            }
            else if (is_Playing and prevKey!=key)
                result = channel->stop();

result = system->playSound(FMOD_CHANNEL_FREE, sound[getNoteForKey(key)], 0, &channel);

gettimeofday(&timer, NULL);
             t2=timer.tv_sec+(timer.tv_usec/1000000.0);
             ERRCHECK(result);
             prevKey=key;

  }


    } while (key != 27);
for(int i=0;i<13;i++){
    result = sound[i]->release();
    ERRCHECK(result);
}

    ERRCHECK(result);
    result = system->close();
    ERRCHECK(result);
    result = system->release();
    ERRCHECK(result);


}
0
boneash napisał(a)
    for(int i=0;i<12;i++){
        result = system->createSound((NoteBase[i]->getTitle()).c_str(), FMOD_SOFTWARE, 0, &(sound[i]));

czy aby 'sound' nie przechowuje 13 elementów? Nie jest alokowana pamięć na ostatni element więc zwraca ci taki błąd, a nie inny, poza tym pod koniec programu zwalniając te zasoby miałbyś wyciek. Takie są skutki stosowania magicznych liczb. Poza tym inicjalizuj zmienne.

0

Niestety nie pomogło

0
void Keyboard::play()
{

	FMOD::Sound      *(sound[13]), ...; //<--- po co te nawiasy? No i dlaczego 13, a nie 12?
	FMOD::Channel    *channel = 0; //<--- !!!

	...
	
	do
	{
		channel->isPlaying(&is_Playing); //<--- channel przy pierwszym obrocie pętli jest NULL.
		...
		
		result = system->playSound(... , &channel);
		...
0

Również nie pomogło. Dodam że działa jeśli każdego *sound (od 1-12) utworzę i zainicjalizuję osobno a nie jako tablicę wskaźników.

0

Pomóc to musiało, bo był to ewidentny błąd, który (najprawdopodobniej) przerwałby program zanim nastąpiłoby wywołanie playSound.

Pokaż kod getNoteForKey.

0

Ok problem był w tej funkcji getNoteforKey() dzięki za pomoc ;]

1 użytkowników online, w tym zalogowanych: 0, gości: 1