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);
}