Aktuelle Zeit: 24.09.2018 23:48

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 31 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3, 4  Nächste
Autor Nachricht
 Betreff des Beitrags: Re: Wie Struktur aus C-Lib in PB importieren
BeitragVerfasst: 12.02.2018 01:30 
Offline
Benutzeravatar

Registriert: 19.10.2006 12:51
Kannst du dafür nicht einen eigenen Thread machen? Das passt jetzt nicht wirklich zu "Wie Struktur aus C-Lib in PB importieren"

_________________
return;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Wie Struktur aus C-Lib in PB importieren
BeitragVerfasst: 12.02.2018 01:38 
Offline

Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge
@DarkSoul

Naja, ein bisschen passt es schon.

Das hier:

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Wie Struktur aus C-Lib in PB importieren
BeitragVerfasst: 12.02.2018 01:42 
Offline
Benutzeravatar

Registriert: 19.10.2006 12:51
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:

_________________
return;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Wie Struktur aus C-Lib in PB importieren
BeitragVerfasst: 12.02.2018 09:03 
Offline
Benutzeravatar

Registriert: 04.08.2009 17:24
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:
Structure SDL_AudioSpec Align #PB_Structure_AlignC
anstatt
Code:
Structure SDL_AudioSpec
verwenden.


P.S.: Kennst du diese Wundermaschine? :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Wie Struktur aus C-Lib in PB importieren
BeitragVerfasst: 12.02.2018 18:03 
Offline

Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge
Hallo Leutchen,

wie übergibt man richtig an:

Code:
soundx.SDL_RWops ;?????

If ( SDL_LoadWAV_(soundx, @wave, @daten, @len) <> #Null )


SDL_LoadWAV nutzt intern SDL_LoadWAV_RW

und ist wie folgt deklariert.

Code:
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:
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

????


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Wie Struktur aus C-Lib in PB importieren
BeitragVerfasst: 12.02.2018 18:13 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
Die FreeBasic-Routine würde ich so übersetzen:
Code:
Procedure.i sub(*userdata, *stream.Ascii, len.l)
EndProcedure

_________________
Freakscorner.de - Der Bastelkeller | Neustes Video: Neje DK - 1 Watt Laser Engraver
Ubuntu Gnome 16.04.3 LTS x64, PureBasic 5.60 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Wie Struktur aus C-Lib in PB importieren
BeitragVerfasst: 12.02.2018 18:20 
Offline

Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge
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:
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

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Wie Struktur aus C-Lib in PB importieren
BeitragVerfasst: 13.02.2018 02:47 
Offline
Benutzeravatar

Registriert: 28.07.2005 12:39
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:
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

_________________
Suche


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Wie Struktur aus C-Lib in PB importieren
BeitragVerfasst: 13.02.2018 18:45 
Offline

Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge
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:
; 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.)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Wie Struktur aus C-Lib in PB importieren
BeitragVerfasst: 13.02.2018 19:04 
Offline

Registriert: 25.03.2013 09:59
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


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 31 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3, 4  Nächste

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

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


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye