Wie Struktur aus C-Lib in PB importieren

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Re: Wie Struktur aus C-Lib in PB importieren

Beitrag von DarkSoul »

Kannst du dafür nicht einen eigenen Thread machen? Das passt jetzt nicht wirklich zu "Wie Struktur aus C-Lib in PB importieren"
Bild
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Wie Struktur aus C-Lib in PB importieren

Beitrag von ccode_new »

@DarkSoul

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
...ist bei mir irgend wie zum Scheitern verurteilt.

Mich interessiert das Thema deshalb auch.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Re: Wie Struktur aus C-Lib in PB importieren

Beitrag von DarkSoul »

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. :roll:

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. :mrgreen:
Bild
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Wie Struktur aus C-Lib in PB importieren

Beitrag von Josh »

DarkSoul 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. :mrgreen:
Einfach

Code: Alles auswählen

Structure SDL_AudioSpec Align #PB_Structure_AlignC
anstatt

Code: Alles auswählen

Structure SDL_AudioSpec
verwenden.


P.S.: Kennst du diese Wundermaschine? :mrgreen:
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Wie Struktur aus C-Lib in PB importieren

Beitrag von ccode_new »

Hallo Leutchen,

wie übergibt man richtig an:

Code: Alles auswählen

soundx.SDL_RWops ;?????

If ( SDL_LoadWAV_(soundx, @wave, @daten, @len) <> #Null )
SDL_LoadWAV nutzt intern SDL_LoadWAV_RW

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
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 ?

Code: Alles auswählen

format\freq = 22050
  format\format = #AUDIO_S16
  format\channels = 2
  format\samples = 512
  format\callback = @audiomix()
  format\userdata = #Null
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

????
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
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

Beitrag von NicTheQuick »

Die FreeBasic-Routine würde ich so übersetzen:

Code: Alles auswählen

Procedure.i sub(*userdata, *stream.Ascii, len.l)
EndProcedure
Bild
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Wie Struktur aus C-Lib in PB importieren

Beitrag von ccode_new »

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 ?

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
;Es kommt immer nur "Else"

->Syntax
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
-->SDL arbeitet auch meisten eher mit UTF-8, als mit Ascii. (Also UTF-8(datei)), aber bringt mich trotzdem noch nicht weiter.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Wie Struktur aus C-Lib in PB importieren

Beitrag von edel »

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? :lol:

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
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Wie Struktur aus C-Lib in PB importieren

Beitrag von ccode_new »

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:

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
-> Dies liefert einen Error.
-> 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
Omi
Beiträge: 143
Registriert: 25.03.2013 09:59

Re: Wie Struktur aus C-Lib in PB importieren

Beitrag von Omi »

Wir kapern jetzt DarkSouls thread völlig :roll:

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
Antworten