Wie Struktur aus C-Lib in PB importieren
Re: Wie Struktur aus C-Lib in PB importieren
Kannst du dafür nicht einen eigenen Thread machen? Das passt jetzt nicht wirklich zu "Wie Struktur aus C-Lib in PB importieren"
Re: Wie Struktur aus C-Lib in PB importieren
@DarkSoul
Naja, ein bisschen passt es schon.
Das hier:
...ist bei mir irgend wie zum Scheitern verurteilt.
Mich interessiert das Thema deshalb auch.
Naja, ein bisschen passt es schon.
Das hier:
Code: Alles auswählen
Structure SDL_AudioSpec2 ;Ist schon vordeklariert !!!
freq.i
format.i
channels.a
silence.a
samples.u
size.l
*callback
*userdata
EndStructure
Global wanted.SDL_AudioSpec2
ImportC "-lSDL"
SDL_OpenAudio.i(*desired.SDL_AudioSpec, *obtained.SDL_AudioSpec)
SDL_LoadWAV.i(file, spec, audio_buf, audio_len)
;....
SDL_Delay(ms)
SDL_Quit()
EndImport
Mich interessiert das Thema deshalb auch.
Betriebssysteme: div. Windows, Linux, Unix - Systeme
no Keyboard, press any key
no mouse, you need a cat
no Keyboard, press any key
no mouse, you need a cat
Re: Wie Struktur aus C-Lib in PB importieren
Naja stimmt schon. Jetzt, wo du dein Problem auch genauer benennst, ist es tatsächlich dasselbe Dilemma. Auch wenn ich den anderen Weg gehen wollte (Raw PCM+Callback)
Ich hänge an derselben Stelle fest.
Ich bekomme im späteren Ablauf Probleme, da ich *desired.SDL_AudioSpec befüllen und übergeben muss, um auf das Device zugreifen zu können.
Willkommen im Boot! Auch wenn der Codeschnipsel, den du gepostet hast, außer Deklarieren und Importieren nichts macht.
Ich hänge an derselben Stelle fest.
Ich bekomme im späteren Ablauf Probleme, da ich *desired.SDL_AudioSpec befüllen und übergeben muss, um auf das Device zugreifen zu können.
Willkommen im Boot! Auch wenn der Codeschnipsel, den du gepostet hast, außer Deklarieren und Importieren nichts macht.
Re: Wie Struktur aus C-Lib in PB importieren
EinfachDarkSoul hat geschrieben:@Josh: Und wie nutze ich diese Konstante? In der PB-Hilfe geht die Suchfunktion nämlich ebenso wenig und ich habe sie nicht wirklich gefunden.
Code: Alles auswählen
Structure SDL_AudioSpec Align #PB_Structure_AlignC
Code: Alles auswählen
Structure SDL_AudioSpec
P.S.: Kennst du diese Wundermaschine?
Re: Wie Struktur aus C-Lib in PB importieren
Hallo Leutchen,
wie übergibt man richtig an:
SDL_LoadWAV nutzt intern SDL_LoadWAV_RW
und ist wie folgt deklariert.
Im sdl - C Quelltext steht das man SDL_LoadWAV_RW z.B. ein const char *datei übergeben kann und SDL_LoadWAV_RW erfordert per C-Quelltext einen Pointer auf die SDL_RWops-Struktur.
Und ist das hier richtig mit dem Callback ?
Hierbei wird per SDL ein solcher Callback benötigt:
type SDL_AudioCallback as sub(byval userdata as any ptr, byval stream as Uint8 ptr, byval len as long) ;FreeBasic-Syntax
????
wie übergibt man richtig an:
Code: Alles auswählen
soundx.SDL_RWops ;?????
If ( SDL_LoadWAV_(soundx, @wave, @daten, @len) <> #Null )
und ist wie folgt deklariert.
Code: Alles auswählen
Procedure SDL_LoadWAV_(fname, spec, audio_buf, audio_len )
ProcedureReturn SDL_LoadWAV_RW_(SDL_RWFromFile_(fname,"rb"), 1, spec, audio_buf, audio_len)
EndProcedure
Und ist das hier richtig mit dem Callback ?
Code: Alles auswählen
format\freq = 22050
format\format = #AUDIO_S16
format\channels = 2
format\samples = 512
format\callback = @audiomix()
format\userdata = #Null
type SDL_AudioCallback as sub(byval userdata as any ptr, byval stream as Uint8 ptr, byval len as long) ;FreeBasic-Syntax
????
Betriebssysteme: div. Windows, Linux, Unix - Systeme
no Keyboard, press any key
no mouse, you need a cat
no Keyboard, press any key
no mouse, you need a cat
- NicTheQuick
- Ein Admin
- Beiträge: 8679
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
- Kontaktdaten:
Re: Wie Struktur aus C-Lib in PB importieren
Die FreeBasic-Routine würde ich so übersetzen:
Code: Alles auswählen
Procedure.i sub(*userdata, *stream.Ascii, len.l)
EndProcedure
Re: Wie Struktur aus C-Lib in PB importieren
Ok, bei .Ascii bin ich mir aber nicht sicher?
Das Hauptproblem liegt aber erstmal bei SDL_LoadWAV_ .
Das wirft bei mir immer einen Fehler.
Daher: Wie muss ich da richtig übergeben ?
Oder ist die Deklaration schon fehlerhaft ?
Wie bringe ich das hier zu laufen ?
;Es kommt immer nur "Else"
->Syntax
Das Hauptproblem liegt aber erstmal bei SDL_LoadWAV_ .
Das wirft bei mir immer einen Fehler.
Daher: Wie muss ich da richtig übergeben ?
Oder ist die Deklaration schon fehlerhaft ?
Wie bringe ich das hier zu laufen ?
Code: Alles auswählen
Procedure play_audio(datei.s)
Protected wave.SDL_AudioSpec
Protected *daten
Protected len.l
Protected cvt.SDL_AudioCVT
Protected format.SDL_AudioSpec
*snd = AllocateMemory(SizeOf(datei)) ;einfach mal so
*gsnd = Ascii(datei)
Debug PeekS(*gsnd,-1,#PB_Ascii)
If ( SDL_LoadWAV_(*gsnd, @wave, @daten, @len) <> #Null )
Debug "Wav is loaded !"
SDL_BuildAudioCVT_(@cvt, wave\format, wave\channels, wave\freq, #AUDIO_S16, 2, 44100)
cvt\buf = AllocateMemory(len * cvt\len_mult)
CopyMemory(@daten, @cvt\buf, len)
cvt\len = len
SDL_ConvertAudio_(@cvt)
SDL_FreeWAV_(*daten)
SDL_LockAudio_()
sound\daten = cvt\buf
sound\len = cvt\len_cvt
sound\pos = 0
SDL_UnlockAudio_()
Else
Debug "Ein Fehler: " + SDL_GetError_()
EndIf
FreeMemory(*snd)
EndProcedure
->Syntax
-->SDL arbeitet auch meisten eher mit UTF-8, als mit Ascii. (Also UTF-8(datei)), aber bringt mich trotzdem noch nicht weiter.SDL_RWops* SDL_RWFromFile(const char* file,
const char* mode)
Function Parameters
file: a UTF-8 string representing the filename to open
mode: an ASCII string representing the mode to be used for opening the file; see Remarks for details
Betriebssysteme: div. Windows, Linux, Unix - Systeme
no Keyboard, press any key
no mouse, you need a cat
no Keyboard, press any key
no mouse, you need a cat
Re: Wie Struktur aus C-Lib in PB importieren
SDL_GetError sagt dir eigentlich was schief laeuft. Die Funktion gibt ein Zeiger auf einen String zurueck, den kannst du mit Peeks auslesen.
In der sdl.pbi scheint es einen Fehler zu geben. bei der Funktion SDL_RWFromFile wird ein Pointer uebergeben, es kommt aber schon ein Pointer als Parameter an. Entferne mal das @ vor fname. Das @ kommt mit bestimmt von dir?
Das hier funktioniert unter Windows 64
In der sdl.pbi scheint es einen Fehler zu geben. bei der Funktion SDL_RWFromFile wird ein Pointer uebergeben, es kommt aber schon ein Pointer als Parameter an. Entferne mal das @ vor fname. Das @ kommt mit bestimmt von dir?
Das hier funktioniert unter Windows 64
Code: Alles auswählen
XIncludeFile "sdl.pbi"
Structure sample
daten.l
pos.l
len.l
EndStructure
Global sound.sample
Global wanted.SDL_AudioSpec
Procedure audiomix(na, stream, laenge)
If sound\len < 1
ProcedureReturn
EndIf
If laenge > sound\len
laenge = sound\len
EndIf
SDL_MixAudio_(stream, sound\daten + sound\pos, laenge, #SDL_MIX_MAXVOLUME)
sound\pos + laenge
sound\len - laenge
EndProcedure
Procedure play_audio(datei.s)
Protected wave.SDL_AudioSpec
Protected *daten
Protected len.l
Protected cvt.SDL_AudioCVT
Protected format.SDL_AudioSpec
If ( SDL_LoadWAV_(Ascii(datei), @wave, @daten, @len) <> #Null )
Debug "Wav is loaded !"
SDL_BuildAudioCVT_(@cvt, wave\format, wave\channels, wave\freq, #AUDIO_S16, 2, 44100)
cvt\buf = AllocateMemory(len * cvt\len_mult)
CopyMemory(daten, cvt\buf, len)
cvt\len = len
SDL_ConvertAudio_(cvt)
SDL_FreeWAV_(daten)
SDL_LockAudio_()
sound\daten = cvt\buf
sound\len = cvt\len_cvt
sound\pos = 0
SDL_UnlockAudio_()
Else
Debug "Ein Fehler: " + PeekS(SDL_GetError_(), -1, #PB_Ascii)
EndIf
EndProcedure
Procedure.i eventloop()
event.SDL_Event
While ( SDL_WaitEvent_(@event) )
keysym.SDL_keysym
Select event\type
Case #SDL_KEYDOWN
keysym = event\key\keysym
If ( keysym\sym = #SDLK_ESCAPE )
Debug "ESCAPE gedrückt."
End
EndIf
If ( keysym\sym = #SDLK_SPACE )
Debug "Leertaste gedrückt."
fsound.s = OpenFileRequester("MusikSuche", "", "*.*", 0)
play_audio(fsound)
EndIf
Case #SDL_QUIT
Debug "Quit event. Bye."
Break
EndSelect
Wend
EndProcedure
Procedure Main()
screen.SDL_Surface
done = 1
format.SDL_AudioSpec
If ( SDL_Init_(#SDL_INIT_EVERYTHING) <> 0 )
Debug "Unable to initialize SDL."
End
EndIf
SDL_SetVideoMode_(256, 256, 16, 0)
If ( screen = #Null )
Debug "Unable to set video mode."
End
EndIf
format\freq = 48000
format\format = #AUDIO_S16
format\channels = 2
format\samples = 512
format\callback = @audiomix()
format\userdata = #Null
If ( SDL_OpenAudio_(@format, #Null) < 0 )
Debug "Audio-Gerät konnte nicht geöffnet werden."
EndIf
SDL_PauseAudio_(0)
While (done)
Debug "ESC für Ende und Leertaste für Sound"
done = eventloop()
Wend
SDL_PauseAudio_(1)
SDL_CloseAudio_()
EndProcedure
Main()
End
Re: Wie Struktur aus C-Lib in PB importieren
Helau und Alaaf edel !
edel über Alles...
Deine Anpassung ist schon ganz gut, aber es funktioniert bei mir trotzdem nicht.
SDL_GetError() liefert bei mir: Entweder einen Speicherfehler oder die Nachricht "Ein Fehler: Couldn't open (×_"
Wobei die kryptischen Zeichen am Ende auch anders aussehen können.
Die selbe getesteten Wav-Dateien können aber problemlos mit dem "gleichen" Programm unter C abgespielt werden.
Das mit dem @ bei "sdl.pbi" verstehe ich nicht.
Die Deklaration sieht so aus:
-> Dies liefert einen Error.
-> Wenn ich bei SDL_LoadWav_ umkommentiere kommt ein Speicherzugrifffehler.
(Es ist genau dein gelieferter Quelltext, welcher getestet wird/wurde.)
edel über Alles...
Deine Anpassung ist schon ganz gut, aber es funktioniert bei mir trotzdem nicht.
SDL_GetError() liefert bei mir: Entweder einen Speicherfehler oder die Nachricht "Ein Fehler: Couldn't open (×_"
Wobei die kryptischen Zeichen am Ende auch anders aussehen können.
Die selbe getesteten Wav-Dateien können aber problemlos mit dem "gleichen" Programm unter C abgespielt werden.
Das mit dem @ bei "sdl.pbi" verstehe ich nicht.
Die Deklaration sieht so aus:
Code: Alles auswählen
; SDL_LoadWAV_RW
Procedure SDL_LoadWAV_RW_( src, freesrc, spec, audio_buf, audio_len)
ProcedureReturn CallCFunctionFast(GetFunction(0, "SDL_LoadWAV_RW"), src, freesrc, spec, audio_buf, audio_len)
EndProcedure
; SDL_LoadWAV
; Load a WAVE file
Procedure SDL_LoadWAV_( fname, spec, audio_buf, audio_len )
;Debug PeekS(fname,-1,#PB_Ascii)
ProcedureReturn SDL_LoadWAV_RW_(SDL_RWFromFile_(fname,"rb"), 1, spec, audio_buf, audio_len)
;ProcedureReturn CallCFunctionFast(GetFunction(0, "SDL_LoadWAV"), SDL_RWFromFile_(fname,"rb"), spec, audio_buf, audio_len)
EndProcedure
-> Wenn ich bei SDL_LoadWav_ umkommentiere kommt ein Speicherzugrifffehler.
(Es ist genau dein gelieferter Quelltext, welcher getestet wird/wurde.)
Betriebssysteme: div. Windows, Linux, Unix - Systeme
no Keyboard, press any key
no mouse, you need a cat
no Keyboard, press any key
no mouse, you need a cat
Re: Wie Struktur aus C-Lib in PB importieren
Wir kapern jetzt DarkSouls thread völlig
Ohne das Ganze jetzt tiefer analysiert oder getestet zu haben - kann auch komplett daneben liegen - nur mal ein Gedanke.
Du übergibst Pointer auf die Filenames die (PB entsprechend konfiguriert) Unicode ergeben.
Ein SDL_RWFromFile benötigt UTF-8 als Filename https://wiki.libsdl.org/SDL_RWFromFile. Bei SDL_LoadWAV steht nix dabei https://wiki.libsdl.org/SDL_LoadWAV.
Kann es sein, dass Linux-typisch alle Filenames als UTF-8-Pointer übergeben werden sollten und diese nur nicht verstanden werden?
Charly
Ohne das Ganze jetzt tiefer analysiert oder getestet zu haben - kann auch komplett daneben liegen - nur mal ein Gedanke.
Du übergibst Pointer auf die Filenames die (PB entsprechend konfiguriert) Unicode ergeben.
Ein SDL_RWFromFile benötigt UTF-8 als Filename https://wiki.libsdl.org/SDL_RWFromFile. Bei SDL_LoadWAV steht nix dabei https://wiki.libsdl.org/SDL_LoadWAV.
Kann es sein, dass Linux-typisch alle Filenames als UTF-8-Pointer übergeben werden sollten und diese nur nicht verstanden werden?
Charly
PureBasic Linux-API-Library: http://www.chabba.de