bies:
'primo': jesli chodzi o odtwarzacze muzyki to strumieniowanie z dysku jest ok, ale jesli o gry chodzi to nie, wyjatkiem moga byc jakies baardzo dlugie utwory (kilkudziesiecio minutowe co najmniej) ktore nie beda sie miescic nawet skompresowane w ramie. ale to sie chyba nie zdarza w profesjonalnych produkcjach...
'secundo': to byl mój argument. dekodowanie w locie nie bedzie powodowac opoznienia na starcie tak duzego jak 'pre-dekodowanie'.
'tertio': twierdzisz ze 2 bufory to malo, 3 to max? nie ma to nic wspolnego z rozmiarami wskaznikow.
'quatro': pisalem juz: chcesz odtworzyc caly plik np. mp3/ogg/whatever to musisz go calego przeczytac. jak piszesz ze 'dysk musi nadazyc z podawaniem danych do karty' - tak. ale nie jesli masz go calego w ramie, skad odczyt do dekompresji jest szybszy.
soku11:
masz na mysli bufory sprzetowe (te 20)? czy dane wav w ram? ja caly czas pisze o buforach sprzetowych. jesli uzywasz jednego to napewno to jest przyczyna zarywania dzwieku. moze wrzuce funkcje z mojego kodu. to jest funkcja ktora przeladowuje bufory i odgrywa dzwiek, uzywam ja zapetlona w watku przy odtwarzaniu:
bool AudioSample::update_buffers()
{
// jesli jakis bufor zakonczyl grac, to go usuwa z kolejki
// i laduje ponownie do niego nowe dane umieszcza go na koncu
// kolejki. funkcja zwraca true jesli dodano nowy element do
// kolejki, jesli nie - zwraca false. jesli nie ma bufora ktory
// skonczyl grac zwraca true
int buff_processed; // ile zostalo juz przetworzonych w kolejce (buforow)
bool active=true;
alGetSourcei(m_source,AL_BUFFERS_PROCESSED,&buff_processed);
// m_source to zrodlo dzwieku
while(buff_processed--) // przejdzie przez wszystkie odegrane bufory
{
ALuint buffer;
// wyjmuje bufor z kolejki (zwraca ktory wlasnie usunal)
alSourceUnqueueBuffers(m_source,1,&buffer);
// laduje nowe dane do tegu usunietego bufora
active=setup_buffer(buffer); // laduje do bufora buffer - tego pustego
// i umieszcza go w kolejce (na koniec)
alSourceQueueBuffers(m_source,1,&buffer);
}
return active;
}