Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 12, 2025 19:22

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: OpenAL problem
BeitragVerfasst: Do Sep 27, 2007 13:28 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ich hab ein Problem mit dem puffern und abspielen von Ogg Dateien.
Wav oder Ogg als ganzes in ein Buffer laden geht und läuft aber wenn ich 2 Buffer nutze und ein Bufferqueue hört er einfach mit dem buffern auf.
Code:
  1.   if AStream.GetExtensionName='ogg' then
  2.   begin
  3.     FBuffer:=OpenAL.GenBuffer;
  4.     FBuffer1:=OpenAL.GenBuffer;
  5.     FOggReader:=TKar_OggVorbisReader.Create(FStream);
  6.     p:=FOggReader.Read(4096*8);
  7.     FBuffer.SetData(FOggReader.Format,p,FOggReader.Size,FOggReader.Frequence);
  8.     p:=FOggReader.Read(4096*8);
  9.     FBuffer1.SetData(FOggReader.Format,p,FOggReader.Size,FOggReader.Frequence);
  10.     FSoundSource:=OpenAL.GenSource;
  11.     OpenAL.alSourceQueueBuffers(FSoundSource.FID, 1, @Fbuffer.FID);
  12.     OpenAL.alSourceQueueBuffers(FSoundSource.FID, 1, @Fbuffer1.FID);
  13.     OpenAL.alSourcei(FSoundSource.FID, AL_LOOPING, AL_FALSE);
  14.   end;

Ich erstelle jeweils einen Buffer und fülle sie mit Daten aus dem OggReader.
Dann erstelle ich ne Source, hänge die einzelnen Buffer in den Queue und stelle Loop ab.

Nun Starte ich den Source mit play und über ne schleife ruft er nun folgendes auf.
Code:
  1.   for i:=0 to FSoundList.count-1 do
  2.   begin
  3.     OpenAL.alGetSourcei(TKar_OALSound(FSoundList[i]).Source.FID, AL_BUFFERS_PROCESSED, @Processed);
  4.     If Processed > 0 Then
  5.         repeat
  6.             OpenAL.alSourceUnqueueBuffers(TKar_OALSound(FSoundList[i]).Source.FID,1,@Buffer);
  7.         p:=TKar_OALSound(FSoundList[i]).OggReader.Read(4096*8);
  8.         if TKar_OALSound(FSoundList[i]).Buffer.FID=Buffer then
  9.           TKar_OALSound(FSoundList[i]).Buffer.SetData(TKar_OALSound(FSoundList[i]).OggReader.Format,p,TKar_OALSound(FSoundList[i]).OggReader.Size,TKar_OALSound(FSoundList[i]).OggReader.Frequence)
  10.         else
  11.           TKar_OALSound(FSoundList[i]).Buffer1.SetData(TKar_OALSound(FSoundList[i]).OggReader.Format,p,TKar_OALSound(FSoundList[i]).OggReader.Size,TKar_OALSound(FSoundList[i]).OggReader.Frequence);
  12.             OpenAL.alSourceQueueBuffers(TKar_OALSound(FSoundList[i]).Source.FID,1,@Buffer);
  13.         dec(processed);
  14.       until Processed <=0;
  15.   end;

Ich gehe alle Sounds durch und gucke ob nen Buffer fertig ist und pack in ihn neue daten rein und leg ihn zurück in den queue.
Wenn ich das nun starte, dann bekomme ich die 2 readstream und dann noch 2 readstream aus der loop und dann macht er garnichts mehr, die loop wird ned mehr aufgerufen, da processed 0 zurück gibt.

Hat wer ne Idee ?

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 27, 2007 13:54 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich rate einfach mal ins blaue:
Ich glaube, man muss die nicht unqueuen. Wenn meine Vermutung zutrifft, dann unqueuest du den Buffer, der eigentlich noch gespielt werden sollte. Ich bin jetzt nicht ganz in der Materie von OpenAL drin, aber könnt sein.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 27, 2007 14:42 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Wenn ich das richtig verstanden habe, dann gibt mir der unqueue befel den die buffer zurück, die halt schon durch sind.
Diese fülle ich dann mit neuen daten und gebe sie zurück in den queue.
Ich hab mal bei Noeska und anderen Tuts/Seiten geguckt und alle haben immer den gleichen Code aber keiner erklärt ihn.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 27, 2007 17:04 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Bitte mal Code-Zeilen auf vernünftiges Maß runterbrechen. Das Layout und die Lesbarkeit leidet.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 27, 2007 18:08 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Das Problem hab ich mitlerweile gelöst, es lag an der größe des Puffers.
OpenAL hate probs mit einen so kleinen Puffer.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 27, 2007 18:35 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 01, 2003 18:59
Beiträge: 887
Wohnort: (The Netherlands)
Programmiersprache: fpc/delphi/java/c#
you should generate your buffers differently:

Code:
  1.  
  2. AlGenBuffers(numbuffers, @buffer);
  3.  

That will create an array of buffers

Code:
  1.  
  2. AlutLoadWavFile('ding.wav', format, data, size, freq, loop);
  3.   AlBufferData(buffer[0], format, data, size, freq);
  4.   AlutUnloadWav(format, data, size, freq);
  5.   AlutLoadWavFile('phaser.wav', format, data, size, freq, loop);
  6.   AlBufferData(buffer[1], format, data, size, freq);
  7.   AlutUnloadWav(format, data, size, freq);
  8.  

Now i load the wav files (i know not real buffering)
But notice AlBufferData where the size of the buffer is set.

Code:
  1.  
  2.   AlGenSources(1, @source);
  3.   alSourceQueueBuffers(source, numbuffers, @buffer);
  4.  

So now you can set the array of buffers to an source.

Buffer sizes should not matter only be sure you have enough time to fill buffer one while buffer two is playing.
E.g. the less buffers the buffer size should be larger and with more buffers the buffer size can be smaller.
E.g. you can calculate the buffer size depending on the length in seconds and the bitrate of the data.

I think my explanation on this in http://www.noeska.com/doal/lesson10.aspx is a bit short.

_________________
http://3das.noeska.com - create adventure games without programming


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 15 Queries | GZIP : On ]