OpenAL

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Vertex

Betreff: OpenAL

BeitragSa, Feb 10, 2007 4:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Gehostet auf GitHub: https://github.com/oliverskawronek/openal.mod

Infos: OpenAL ist eine Plattform unabhängige 3D Sound API die ähnlich OpenGL gestaltet ist. www.openal.org/

Beinhaltet AL, ALC, ALUT und ALEXT

Für ein größeres Beispiel bin ich zu müde:
Code: [AUSKLAPPEN]
SuperStrict

Framework Vertex.OpenAL
Import BRL.StandardIO

Global Device  : Byte Ptr, ..
       Context : Byte Ptr


Device = alcOpenDevice(Null)
Context = alcCreateContext(Device, Null)
alcMakeContextCurrent(Context)

Print(String.FromCString(alGetString(AL_VENDOR)))
Print(String.FromCString(alGetString(AL_RENDERER)))

alcDestroyContext(Context)
alcCloseDevice(Device)
End


mfg olli
  • Zuletzt bearbeitet von Vertex am Mi, Sep 09, 2015 10:04, insgesamt einmal bearbeitet

Jan_

Ehemaliger Admin

BeitragSa, Feb 10, 2007 19:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Geile Sau, ich glaubs ja nett!
between angels and insects

Vertex

BeitragMo, Feb 12, 2007 21:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Smile Ich sehe mal zu, dass ich über die Woche OGG Vorbis zum laufen bekomme. Über alSourceQueueBuffers kann man flüssig Streams abspielen. Während der eine Buffer gerade abgespielt wird, kann der andere im Hintegrund schon mit PCM Daten aus der *.ogg Datei bestückt werden. Also so ähnlich, wie beim flimmerfreien Doublebuffering in Grafikanwendungen. In BMax werden die *.ogg Dateien ja leider nur statisch auf einem Rutsch geladen. Das bedeutet lange Ladezeiten und große Speicherverschwendung.

In anderen Foren habe ich von 4-5% CPU Auslastung gelesen beim gestreamten abspielen. Für Spiele also ganz interessant.

mfg olli
vertex.dreamfall.at | GitHub

Vertex

BeitragDi, Feb 13, 2007 21:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Wollte eigentlich Ogg und Vorbis direkt linken, da muckte mir BMax aber mal wieder herum.

Also greife ich doch auf den Standardloader Pub.OggLoader zurück der völlig verhunzte Datentypen benutzt.

Hier ein Beispiel, wie man Ogg Lieder abspielt. Leider erst einmal nur statisch Razz

Code: [AUSKLAPPEN]
SuperStrict

Framework Vertex.OpenAL
Import Pub.OggVorbis
Import BRL.FileSystem
Import BRL.PolledInput

Const SEEK_SET : Int = 0
Const SEEK_CUR : Int = 1
Const SEEK_END : Int = 2

Global Stream    : TStream, ..
       Samples   : Int, ..
       Channels  : Int, ..
       Frequence : Int, ..
       OggFile   : Byte Ptr, ..
       Size      : Int, ..
       OggBuffer : Byte Ptr, ..
       Format    : Int

Global Device  : Byte Ptr, ..
       Context : Byte Ptr, ..
       Buffer  : Int, ..
       Source  : Int, ..
       State   : Int


Stream = ReadStream("Test.ogg")
If Not Stream Then Throw("Unable to load file")

OggFile = Decode_Ogg(Stream, VorbisRead, VorbisSeek, VorbisClose, VorbisTell, ..
                     Samples, Channels, Frequence)
If Not OggFile Then Throw("Unable to read file")

Size = Samples*2*Channels
OggBuffer = MemAlloc(Size)

Select Channels
   Case 1
      Format = AL_FORMAT_MONO16
   Case 2
      Format = AL_FORMAT_STEREO16
End Select

Device = alcOpenDevice(Null)
Context = alcCreateContext(Device, Null)
alcMakeContextCurrent(Context)

alGenBuffers(1, Varptr(Buffer))
Read_Ogg(OggFile, OggBuffer, Size)

alBufferData(Buffer, Format, OggBuffer, Size, Frequence)

alGenSources(1, Varptr(Source))
alSourcei(Source, AL_BUFFER, Buffer)

alSourcePlay(Source)
Repeat
   alGetSourcei(Source, AL_SOURCE_STATE, Varptr(State))
Until State <> AL_PLAYING

alcDestroyContext(Context)
alcCloseDevice(Device)
End

Function VorbisRead:Int(Buffer:Byte Ptr, ByteSize:Int, Count:Int, Stream:Object)
   Return TStream(Stream).Read(Buffer, ByteSize*Count)/ByteSize
End Function

Function VorbisSeek:Int(Stream:Object, Offset0:Int, Offset1:Int, Origin:Int)
   Local Success:Int

   Success = -1
   Select Origin
      Case SEEK_SET
         Success = TStream(Stream).Seek(Int(Offset0))
      
      Case SEEK_CUR
         Success = TStream(Stream).Seek(TStream(Stream).Pos() + Offset0)
      
      Case SEEK_END
         Success = TStream(Stream).Seek(TStream(Stream).Size() + Offset0)
   End Select

   If Success = -1 Then Return -1

   Return 0
End Function

Function VorbisClose:Int(Stream:Object)
   TStream(Stream).Close()
End Function

Function VorbisTell:Int(Stream:Object)
   Return TStream(Stream).Pos()
End Function


mfg olli
vertex.dreamfall.at | GitHub

Lunatix

BeitragDo, März 22, 2007 20:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Darf man denn die "OpenAL32.dll" usw. in sein program-verzeichnis packen, und dies gleich mitliefern, oder muss bei der Installation ein "Dieses program benötigt OpenAL version xx.xx.xx, klicken sie hier, um die installation eines Drittanbieters zu starten" (oder so ähnlich) ?
[size=9]Pro|gram|mier|er: Ein Organismus, der Koffein in Software umwandelt.
Geben Sie eine beliebige 11-stellige Primzahl ein, um fortzusetzen...

Vertex

BeitragDo, März 22, 2007 21:03
Antworten mit Zitat
Benutzer-Profile anzeigen
http://de.wikipedia.org/wiki/OpenAL
OpenAL steht für Windows, Linux und MacOS also unter LPGL

Siehe dazu
http://de.wikipedia.org/wiki/LGPL

Zitat:
Im Gegensatz zur GPL dürfen alle Programme, welche die LGPL-lizenzierte Software nur extern benutzen, zum Beispiel als DLL Files, ihre eigene Lizenz behalten. Damit eignet sich die LGPL besonders als Lizenz für Bibliotheken, deren Benutzung man auch Programmierern proprietärer Programme erlauben will. Soll die unter der LGPL lizenzierte Software dagegen fest in ein anderes Programm eingebunden werden, muss auch das andere Programm unter der LGPL bzw. einer kompatiblen Lizenz stehen.


Aber ganz ehrlich, ich sehe im Lizensjungle auch nicht durch. Nach dem Lesen vom Wiki-Artikel habe ich mehr Fragen als Antworten zur LGPL.

mfg olli
vertex.dreamfall.at | GitHub

Lunatix

BeitragDo, März 22, 2007 21:23
Antworten mit Zitat
Benutzer-Profile anzeigen
mmh... naja, ich wollte eigendlich das program als Freeware entwickeln, aber den Sourcecode nicht freigeben... heisst, ich darf OpenAL garnicht nutzen... ?
[size=9]Pro|gram|mier|er: Ein Organismus, der Koffein in Software umwandelt.
Geben Sie eine beliebige 11-stellige Primzahl ein, um fortzusetzen...

Vertex

BeitragDo, März 22, 2007 23:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Lies dir nochmal den zitierten text durch! Da steht, dass du OpenAL beispielsweise als *.dll verwenden darfst, ohne die Lizens deiner Software zu verändern. Würdest du OpenAL direkt einbinden(simple gesprochen, den Inhalt der DLL in deine Exe kopieren), müsste dein Programm ebenfalls unter LGPL stehen.
vertex.dreamfall.at | GitHub

Lunatix

BeitragFr, März 23, 2007 0:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Ouch >.<

Ok dann kannichs ja doch nutzen.... (ich hab schon einen Wav Streamer angefangen, deshalb xD)
Naja, obs was wird weissich nicht... kannich ja OpenAL doch nutzen Smile
[size=9]Pro|gram|mier|er: Ein Organismus, der Koffein in Software umwandelt.
Geben Sie eine beliebige 11-stellige Primzahl ein, um fortzusetzen...

Vertex

BeitragDo, Apr 19, 2007 15:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe 1-2 Konstanten vergessen:
http://vertex.dreamfall.at/openal/openal102.zip <- neue Version

Ich habe auch gleich mal meine TOggVorbis Klasse öffentlich gemacht:
http://vertex.dreamfall.at/openal/oggvorbis.zip

Damit kann man nun auch gestreamte OggVorbis Songs abspielen ohne lange Ladezeiten zu haben und haufen Speicher zu vergeuten(BRL lässt grüßen Wink )

Beispiel:
Code: [AUSKLAPPEN]
SuperStrict

Framework Vertex.OpenAL
Import "OggVorbis.bmx"

Global Device  : Byte Ptr, ..
       Context : Byte Ptr, ..
       Song    : TOggVorbis

Device = alcOpenDevice(Null)
Context = alcCreateContext(Device, Null)
alcMakeContextCurrent(Context)

Song = TOggVorbis.Load("The Dandy Warhols - Bohemian like you.ogg")
Song.Play()
While Song.State() = STATE_PLAYING
   Song.Decode()
   Delay(10)
Wend

alcMakeContextCurrent(Null)
alcDestroyContext(Context)
alcCloseDevice(Device)
End


Interface der Klasse:
Code: [AUSKLAPPEN]
TOggVorbis
 Method Play()
 Method SetVolume(Volume:Float)
  - from 0.0 till 1.0
 Method State:Int()
  - STATE_INITIAL
  - STATE_PLAYING
  - STATE_PAUSED
  - STATE_STOPPED
 Method Stop()
 Method Pause()
 Method Length:Long()
  - in milliseconds
 Method Seek(Milliseconds:Long)
 Method Position:Long()
  - decode position in milliseconds
 Method Decode()
 Function Load:TOggVorbis(URL:OBject)


Der Spaß läuft mit gerademal 1-2 % CPU Auslastung.

mfg olli
vertex.dreamfall.at | GitHub
 

porcus

BeitragFr, Nov 02, 2007 22:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

OpenAl ist ja anscheinend für 3DSound-Angelegenheiten gut.
Gibt es irgendwo eine einfache Anleitung wo man die 3DSound-Angelegenheiten erklärt bekommt ?
Geht 3D-Sound auch mit der TOggVorbis Klasse und wenn ja wie?

THX schonmal im Vorraus
*Account deaktiviert*

Vertex

BeitragSa, Nov 03, 2007 16:42
Antworten mit Zitat
Benutzer-Profile anzeigen
OpenAL Programmers Guide da ist eine ausführliche Beschreibung dabei zu Velocity, Position, Dinstancemodel usw.

Ich habe zwar keinen Vorbis Song mit 5.1 getestet, sollte aber funktionieren. Der 5.1 Sound wird wie gehabt geladen und die TOggVorbis Klasse erstellt einen Buffer mit nicht nur 2 Channels.

mfg olli
vertex.dreamfall.at | GitHub
 

porcus

BeitragSo, Nov 04, 2007 12:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Seltsamerweise funktioniert der 3D-Sound bei mir irgendwie nicht. Selbst die Beispiele aus dem OpenAL SDK
funktionieren teilweise nicht richtig. Ich habe bei mir eine alte Stereo-Soundkarte drin (weil mein onboard Chip
kaputt ist). Könnte es damit was zu tun haben?

Edit:
Hab jetzt zur Sicherheit ne andre Soundkarte drin, es geht aber immer noch nicht.
Ich bin jetzt halt leider ziemlich ratlos und würde mich über Hilfe sehr freuen.
Hier ist jedenfalls mal der Code:

Code: [AUSKLAPPEN]
Framework Vertex.OpenAL
Import "OggVorbis.bmx"

Global Device  : Byte Ptr, ..
       Context : Byte Ptr, ..
       Song    : TOggVorbis

Device = alcOpenDevice(Null)
Context = alcCreateContext(Device, Null)
alcMakeContextCurrent(Context)

Song = TOggVorbis.Load("test.ogg")

Local xposition:Float=2
Local yposition:Float=0
Local tposition:Float=0

Local xvelocity:Float=0
Local yvelocity:Float=0
Local zvelocity:Float=0

'//set source position
alSource3f(Song.Source,AL_POSITION, xposition, yposition, zposition)

'//set source velocity
alSource3f(Song.Source,AL_VELOCITY, xvelocity, yvelocity, zvelocity)


Local listenerx:Float=0
Local listenery:Float=0
Local listenerz:Float=0

Local vec:Float[6]

'listenerx=10.0f;
'listenery=0.0f;
'listenerz=5.0f;

vec[0] = 0'fvecx'; //forward vector x value
vec[1] = 0'fvecy'; //forward vector y value
vec[2] = 0'fvecz'; //forward vector z value
vec[3] = 0'uvecx'; //up vector x value
vec[4] = 0'uvecy'; //up vector y value
vec[5] = 0'uvecz'; //up vector z value

'//set current listener position
alListener3f(AL_POSITION, listenerx, listenery, listenerz)

'//set current listener orientation
alListenerfv(AL_ORIENTATION, vec)


Song.Play()
While Song.State() = STATE_PLAYING
   Song.Decode()
   Delay(10)
Wend

alcMakeContextCurrent(Null)
alcDestroyContext(Context)
alcCloseDevice(Device)
End


Wenn ich das recht verstanden habe müsste es sich demnach so anhören als ob der Sound von Rechts
käme (2,0,0), es hört sich aber an wie immer.
 

real76

BeitragDo, Nov 22, 2007 12:34
Antworten mit Zitat
Benutzer-Profile anzeigen
OpenAL unter Blitzmax kam mir doch bekannt vor:
http://blitzmax.com/en/Communi...224#796062
 

porcus

BeitragMo, Dez 10, 2007 16:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe neulich versucht einen Soundeffekt(Reverb) zu verwenden.
Dabei kam ein Fehlermeldung. Offenbar sind nicht alle Funktionen im Wrapper enthalten (EAX).
*Account deaktiviert*

Vertex

BeitragDi, Dez 11, 2007 1:03
Antworten mit Zitat
Benutzer-Profile anzeigen
real76: ich war aber eher da Razz

porcus: musst mir schon sagen, welche Funktion fehlt, sonst kann ich da nichts machen.

Meine Version aufm Rechner läuft übrigens so ähnlich, wie die Pub.OpenAL.

TOpenAL.Open() ' Lädt Bibliothek und erzeugt Exception
TOpenAL.Init() ' belegt alle Funktionsprototypen mti Funktionsadressen aus der Library
TOpenAL.Close() ' Gibt Library wieder frei

Ich verzichte hier auf C Wrapper läuft aber z.Z. nur unter Windows und Linux. MacOS kann ich nicht testen. Vllt. lade ich mal demnächst eine neue Version hoch.

Achja, 3D Sound funktioniert nur mit Buffern die nur einen Kanal haben(sprich mono).

Porcus, stell dir vor, der Listener ist ein gerichtetes Mikrofon, dass du im Raum platzierst. Du gibst ihm eine Position, du richtest es nach links und rechts sowie nach oben und unten aus über den ForwardVector und dann drehst du es noch um die eigene Achse(eigene Achse = ForwardVector) über den UpVector. Der Sollte orthogonal zum ForwardVector sein.

mfg olli
vertex.dreamfall.at | GitHub
 

porcus

BeitragDi, Dez 11, 2007 19:29
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo.
ich glaube das mit der orientation hab ich jetzt kapiert.

Leider habe ich den Quelltext schon gelöscht Crying or Very sad , weswegen ich die Funktion nicht genau sagen kann.
Ich werde aber gleich danach schauen.
Ich habe dazu mir das 1 Tutorial aus Effects Extension Guide.pdf aus aus dem SDK angeschaut.
Habs hier:http://www.file-upload.net/dow...e.pdf.html hochgeladen. Offenbar gibt es da einige Funktionen, die in deinem Wrapper nicht enthalten sind.
*Account deaktiviert*

Vertex

BeitragDi, Dez 11, 2007 22:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Jup, das ist in der Tat nicht im Modul vorhanden. Das ist die ALC Extension EFX. Ich versuch die mal bis Ende der Woche mit ins Modul einzubauen. Die MacOS Benutzer haben dann halt Pech Razz

Ich werde das dann vllt. so machen:
TOpenAL.InitALUt() ' Funktionsadressen für AL Utility zuweisen
TOpenAL.InitEFX() ' Funktionsadressen für EFX zuweisen
vertex.dreamfall.at | GitHub
 

porcus

BeitragMi, Dez 12, 2007 14:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke schonmal! Very Happy *freu* Very Happy

Aber wäre es nicht sinnvoll die original Funktionen des ALC Extension EFX beizubehalten? Man könnte dann
einfacher bestehende Quelltexte, Beispiele oder darauf aufbauende Funktionen nach BlitzMax umschreiben.
Man kann ja zusätzlich eine OOP Angelegenheit dazu machen aber nicht als Ersatz für die
originalen Funktionen. Dh. im Klartext, es wäre wünschenswert, wenn man um die original Funktionen
auszufüheren auch den origiginal Namen dazu hätte und nicht dan sowas wie blurpuzstriu7a6w(bla,bla,bla)
aufrufen müsste.
*Account deaktiviert*

Vertex

BeitragMi, Dez 12, 2007 22:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Keine Angst, das war nie geplant.

Alle Funktionsprototypen bleiben global und haben den selben Namen, wie die in den original C-Headerdateien.

TOpenAL bietet nur eine Klasse zum kapseln der Bibliothek und Gewinnen der Funktionsadressen.
vertex.dreamfall.at | GitHub

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group