Ik heb een project waarbij ik twee 'kanalen' heb:
• audio afspeel (voornamelijk ADPCM44.1) dit speel ik af op OSX en Linux.
• aansturing van apparatuur gebaseerd op muziek.
Waar ik echter steeds tegenaan loop is dat de library die ik voor de playback gebruik hickups geeft of niet neer synchroom loopt, de volgende libraries heb ik getest:
• SDL
• QT 4.8.1's QAudioOutput
Hierbij gebruik ik momenteel QT als laatste. Wat ik sowieso merk aan de QAudioOutput is dat deze niet echt stabiel is. Waar het aan ligt is mij nog onduidelijk. Het probleem is dat datgene dat ik doe perfect op de muziek gelijk moet lopen. Bij SDL heb ik geen feedback over hoe ver de player is in de stream. Daar moet ik dus een aparte 'metronoom' mee laten lopen. Bij elke hickup tussen deze twee processen ontstaat er dan dus een verschil.
Bij QT is er de functie setNotifyInterval(). Echter komt het random voor dat midden in een file die ik aan het afspelen zijn ik geen feedback meer krijg van de QAudioOutput. Op dat moment stopt dus de aansturing van de apparatuur. Waarom ik geen feedback meer krijg is mij een raadsel, het schijnt volgens QT Mailing lists met QT 5.0 een stuk beter te moeten werken.
Dat biedt mij nu geen oplossing dus ik ben aan het kijken of ik niet meer lowlevel die audioaansturing kan gaan doen. Zodat de routine die de playback doet ook de aansturing van de apparatuur kan triggeren.
Om toch een beetje crossplatform te blijven zit ik dan te denken aan PulseAudio met libsndfile. In principe zit ik dan in de sf_read_double()-loop die iets zou kunnen triggeren.
Deze sf_read_double()-loop zou ik dan in een aparte thread willen stoppen en ik zou graag om de 50 of 100ms een update willen hebben. Afhankelijk van de buffergrootte zou ik dit moeten kunnen berekenen.
Om delays te voorkomen zou ik het liefst de hele wave-file in het geheugen zetten. Ik denk dat dit namelijk een van de redenen van de hickups is. libsndfile heeft een mooie sf_open_virtual() functie.
Wat zie ik nog meer over het hoofd om deze player backend helemaal smooth te krijgen? Ik gebruik pthreads en kan dan SCHED_FIFO gebruiken om deze thread de hoogste prioriteit te geven.
• audio afspeel (voornamelijk ADPCM44.1) dit speel ik af op OSX en Linux.
• aansturing van apparatuur gebaseerd op muziek.
Waar ik echter steeds tegenaan loop is dat de library die ik voor de playback gebruik hickups geeft of niet neer synchroom loopt, de volgende libraries heb ik getest:
• SDL
• QT 4.8.1's QAudioOutput
Hierbij gebruik ik momenteel QT als laatste. Wat ik sowieso merk aan de QAudioOutput is dat deze niet echt stabiel is. Waar het aan ligt is mij nog onduidelijk. Het probleem is dat datgene dat ik doe perfect op de muziek gelijk moet lopen. Bij SDL heb ik geen feedback over hoe ver de player is in de stream. Daar moet ik dus een aparte 'metronoom' mee laten lopen. Bij elke hickup tussen deze twee processen ontstaat er dan dus een verschil.
Bij QT is er de functie setNotifyInterval(). Echter komt het random voor dat midden in een file die ik aan het afspelen zijn ik geen feedback meer krijg van de QAudioOutput. Op dat moment stopt dus de aansturing van de apparatuur. Waarom ik geen feedback meer krijg is mij een raadsel, het schijnt volgens QT Mailing lists met QT 5.0 een stuk beter te moeten werken.
Dat biedt mij nu geen oplossing dus ik ben aan het kijken of ik niet meer lowlevel die audioaansturing kan gaan doen. Zodat de routine die de playback doet ook de aansturing van de apparatuur kan triggeren.
Om toch een beetje crossplatform te blijven zit ik dan te denken aan PulseAudio met libsndfile. In principe zit ik dan in de sf_read_double()-loop die iets zou kunnen triggeren.
Deze sf_read_double()-loop zou ik dan in een aparte thread willen stoppen en ik zou graag om de 50 of 100ms een update willen hebben. Afhankelijk van de buffergrootte zou ik dit moeten kunnen berekenen.
Om delays te voorkomen zou ik het liefst de hele wave-file in het geheugen zetten. Ik denk dat dit namelijk een van de redenen van de hickups is. libsndfile heeft een mooie sf_open_virtual() functie.
Wat zie ik nog meer over het hoofd om deze player backend helemaal smooth te krijgen? Ik gebruik pthreads en kan dan SCHED_FIFO gebruiken om deze thread de hoogste prioriteit te geven.
Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!