Aktuelle Zeit: 15.08.2018 14:46

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: 13.02.2018 19:27 
Offline

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

wenn ich den Datei-String als UTF8 übergebe:

Code:
If ( SDL_LoadWAV_(UTF8(datei), @wave, @daten, @len) <> #Null )


springt es trotzdem in den Else-Block.

-> SDL_GetError_() liefert dabei nur andere kryptische Zeichen.
z.B. Ein Fehler: Couldn't open Xææ

Anbei: Wenn ich als Unicode übergebe stürzt das Programm Kommentarlos ab.

Anbei 2: Debug PeekS(fname,-1,#PB_Ascii) liefert aber den korrekten String.

????? Kennt sich jemand aus ?


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

Registriert: 19.10.2006 12:51
Zitat:
Wir kapern jetzt DarkSouls thread völlig :roll:

Nicht schlimm, da ich das Problem in meinem Fall gelöst habe. :mrgreen:

Vielleicht schafft ihr das ja noch irgendwie, SDL unter PB zum Laufen zu bringen. :)

Das sieht mir in disem Fall sehr nach nem kaputten Zeiger aus, weil der Zeichensalat dort steht, wo eigentlich ein Dateiname stehen sollte.

Edit: Habe ihn ausfindig gemacht.

Code:
; SDL_LoadWAV
; Load a WAVE file
Procedure SDL_LoadWAV_(*fname, *spec, *audio_buf, *audio_len )
  ProcedureReturn SDL_LoadWAV_RW_(SDL_RWFromFile_(*fname,[color=#FF0000]@[/color]"rb"), 1, *spec, *audio_buf, *audio_len)
EndProcedure

Das rote @ fehlt bei dir (bzw. jenes zwischen den ungeparsten [color]-tags, ich kriege das gerade nicht hervorgehoben :mrgreen: ).

Der zweite Parameter von SDL_RW_FromFile ist ein Zeiger auf einen String. du übergibst dort direkt einen String. Der Dateiname ist in UTF8 angelegt, daher ist UTF8() schon richtig. https://wiki.libsdl.org/SDL_RWFromFile.

Musst mit den Strings aufpassen, weil PB die standardmäßig by value und C standardmäßig by reference (const char*) übergibt. :)

Wenn du das anpasst, dann lädt er bei mir die Datei, Schmiet dafür allerdings in Zeile 830 in der .pbi ab. :D

_________________
return;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Wie Struktur aus C-Lib in PB importieren
BeitragVerfasst: 14.02.2018 00:07 
Offline

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

das mit dem @ vor "rb" bringt bei mir irgendwie trotzdem noch nichts.

?????


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Wie Struktur aus C-Lib in PB importieren
BeitragVerfasst: 14.02.2018 00:30 
Offline
Benutzeravatar

Registriert: 19.10.2006 12:51
Oder war das doch der erste Parameter? Einer von den beiden war jedenfalls kein korrekter Pointer. Ich habe die Datei beim Testen überschrieben und komme jetzt nicht mehr soweit zurück, um nochmal nachzusehen.

Musst natürlich noch die Methode SDL_RWFromFile_() entsprechend anpassen (Hattest dort Pointer auf Pointer übergeben. Wenn du im Hauptprogramm Pointer übergibst, darfst du in den Methoden deiner Lib nicht nochmal das @ bei der Übergabe verwenden, weil sonst haste Pointer auf Pointer und das war bei einem der Parameter der Fall):

Code:
; SDL_RWFromFile
Procedure SDL_RWFromFile_( *fname, *mode)
  ProcedureReturn CallCFunctionFast(GetFunction(0, "SDL_RWFromFile"), *fname, *mode)
EndProcedure


Also bei mir lädt die Datei zuverlässig. Wenn das bei dir nicht der Fall ist, hast du noch irgendwo einen anderen Fehler drin, der sich nur bei dir auswirkt. :wink:

Ansonsten: Weiß heißt "das mit dem @ vor "rb" bringt bei mir irgendwie trotzdem noch nichts." genau?

_________________
return;


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

Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge
@DarkSoul:

Ok, die Datei läd jetzt, aber es wird kein Sound abgespielt.

Irgendwo anders ist da noch der Wurm drin.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Wie Struktur aus C-Lib in PB importieren
BeitragVerfasst: 14.02.2018 00:53 
Offline
Benutzeravatar

Registriert: 19.10.2006 12:51
Mindestens an der Stelle, die ich bereits geschrieben habe:

Zitat:
Wenn du das anpasst, dann lädt er bei mir die Datei, Schmiert dafür allerdings in Zeile 830 in der .pbi ab. :D


:mrgreen:

Ich mache immer ein '*' vor Zeigernamen. Ist in PB zwar nur ein statischer Name und hat nicht die gleiche Funktionalität wie bei C, aber so sehe ich immer, dass es sich um solche handelt und dann komme ich da nicht durcheinander. :wink:

_________________
return;


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

Registriert: 28.07.2005 12:39
Hi!

Ich habe den Code mal etwas ueberarbeitet. Es funktioniert ohne die vermurkste "sdl.pbi" unter Windows, wie es mit Linux aussieht weiss ich nicht

Code:
Structure SDL_Userdata
  *buffer
  pos.l
  len.l
EndStructure

CompilerIf #PB_Compiler_OS = #PB_OS_Windows
 
#SDL_INIT_AUDIO    = $10
#AUDIO_S16         = $8010
#SDL_MIX_MAXVOLUME = 128

Structure SDL_AudioSpec
  freq.l
  format.w
  channels.b
  silence.b
  samples.w
  padding.w
  size.l
  *callback
  *userdata
EndStructure

Structure SDL_AudioCVT
  needed.l
  src_format.w
  dst_format.w
  rate_incr.double
  *buf
  len.l
  len_cvt.l
  len_mult.l
  PB_Alignment.b[4]
  len_ratio.double
  *filters[10]
  filter_index.l
  PB_Alignment1.b[4]
EndStructure

Import "sdl.lib" ; Windows 64 -> "D:\PellesC\Bin\polib.exe" SDL.dll /MACHINE:X64 /out:sdl.lib
  SDL_Init_(mod) As "SDL_Init"
  SDL_MixAudio_(*dst, *src, len, volume) As "SDL_MixAudio"
  SDL_GetError_() As "SDL_GetError"
  SDL_OpenAudio_(*desired, *obtained) As "SDL_OpenAudio"
  SDL_Quit_() As "SDL_Quit"
  SDL_LoadWAV_RW_(src, freesrc, spec, audio_buf, audio_len) As "SDL_LoadWAV_RW"
  SDL_FreeWAV_(*buffer) As "SDL_FreeWAV"
  SDL_RWFromFile_(fileName.p-ascii, mode.p-ascii) As "SDL_RWFromFile"
  SDL_FreeRW_(*context) As "SDL_FreeRW"
  SDL_ConvertAudio_(*cvt) As "SDL_ConvertAudio"
  SDL_PauseAudio_(state) As "SDL_PauseAudio"
  SDL_BuildAudioCVT_( cvt, src_format, src_channels, src_rate, dst_format, dst_channels, dst_rate) As "SDL_BuildAudioCVT"
EndImport

CompilerEndIf

Procedure.s getWave()
  Protected fileName.s = GetTemporaryDirectory() + "LRMonoPhase4.wav"
  InitNetwork()
  ReceiveHTTPFile("http://www.kozco.com/tech/LRMonoPhase4.wav", fileName)
  ProcedureReturn fileName
EndProcedure

Procedure printSDLError()
  Debug "Error!"
  Debug  PeekS(SDL_GetError_(), -1, #PB_Ascii) 
EndProcedure

Procedure loadWave(fileName.s, *uData.SDL_Userdata)
  Protected *context = SDL_RWFromFile_(fileName, "rb")
  Protected wav_spec.SDL_AudioSpec
  Protected *wav_buffer
  Protected wav_len.l
  Protected cvt.SDL_AudioCVT

  If *context = 0
    ProcedureReturn printSDLError()
  EndIf
   
  If SDL_LoadWAV_RW_(*context, 1, wav_spec, @*wav_buffer, @wav_len) = 0
    ProcedureReturn printSDLError()
  EndIf 
 
   If SDL_BuildAudioCVT_(@cvt, wav_spec\format, wav_spec\channels, wav_spec\freq, #AUDIO_S16, 2, 48000) < 0     
     SDL_FreeRW_(*context)
     ProcedureReturn printSDLError()
   EndIf
   
   cvt\len = wav_len
   cvt\buf = AllocateMemory(cvt\len * cvt\len_mult)
   CopyMemory(*wav_buffer, cvt\buf, cvt\len)
   
   If SDL_ConvertAudio_(cvt)
     SDL_FreeRW_(*context)
     ProcedureReturn printSDLError()     
   EndIf
   
   SDL_FreeWAV_(*wav_buffer)
   
   *uData\buffer = cvt\buf
   *uData\len = cvt\len_cvt   
   
EndProcedure

ProcedureC audioCB(*userdata.SDL_Userdata, *stream, len.l)
 
  If *userdata\len < 1
    ProcedureReturn
  EndIf
 
  If len > *userdata\len
    len = *userdata\len
  EndIf
   
  SDL_MixAudio_(*stream, *userdata\buffer + *userdata\pos, len, #SDL_MIX_MAXVOLUME) 
 
  *userdata\pos + len
  *userdata\len - len
 
EndProcedure

Procedure main()
  Protected outFor.SDL_AudioSpec
  Protected uData.SDL_Userdata
 
  outFor\freq     = 48000
  outFor\format   = #AUDIO_S16
  outFor\channels = 2
  outFor\samples  = 4096
  outFor\callback = @audioCB()   
  outFor\userdata = uData
 
  If SDL_Init_(#SDL_INIT_AUDIO) 
    ProcedureReturn printSDLError()   
  EndIf
 
  If SDL_OpenAudio_(outFor, #Null)
    ProcedureReturn printSDLError()   
  EndIf 
 
  loadWave(getWave(), uData)
 
  SDL_PauseAudio_(0)
 
  While uData\len > 0   
  Wend 
 
  SDL_Quit_()
EndProcedure:End main()

_________________
Suche


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Wie Struktur aus C-Lib in PB importieren
BeitragVerfasst: 14.02.2018 15:11 
Offline
Benutzeravatar

Registriert: 19.10.2006 12:51
Deine Implementierung finde ich viel sauberer :allright: .

Funktioniert allerdings trotzdem nicht:
Zitat:
Error!
Unrecognized file type (not WAVE)


Es wird keine PCM-Wave-Datei akzeptiert. Ab Zeile 80 gibt's Probleme, die ich jetzt auf die Schnelle nicht finden konnte (außer, dass im Import-Block der Dateiname mit p-ascii deklariert ist, woran es aber nicht liegt.)

_________________
return;


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

Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge
@edel

Fetzt !!! Du bist der Held! :praise:

So funktioniert es jetzt unter Linux:

Code:
ImportC "-lSDL"
  SDL_Init_(mod) As "SDL_Init"
  SDL_MixAudio_(*dst, *src, len, volume) As "SDL_MixAudio"
  SDL_GetError_() As "SDL_GetError"
  SDL_OpenAudio_(*desired, *obtained) As "SDL_OpenAudio"
  SDL_Quit_() As "SDL_Quit"
  SDL_LoadWAV_RW_(src, freesrc, spec, audio_buf, audio_len) As "SDL_LoadWAV_RW"
  SDL_FreeWAV_(*buffer) As "SDL_FreeWAV"
  SDL_RWFromFile_(fileName.p-ascii, mode.p-ascii) As "SDL_RWFromFile"
  SDL_FreeRW_(*context) As "SDL_FreeRW"
  SDL_ConvertAudio_(*cvt) As "SDL_ConvertAudio"
  SDL_PauseAudio_(state) As "SDL_PauseAudio"
  SDL_BuildAudioCVT_( cvt, src_format, src_channels, src_rate, dst_format, dst_channels, dst_rate) As "SDL_BuildAudioCVT"
EndImport

Structure SDL_Userdata
  *buffer
  pos.l
  len.l
EndStructure

Procedure printSDLError()
  Debug "Error!"
  Debug  PeekS(SDL_GetError_(), -1, #PB_Ascii)
EndProcedure

Procedure loadWave(fileName.s, *uData.SDL_Userdata)
  Protected *context = SDL_RWFromFile_(fileName, "rb")
  Protected wav_spec.SDL_AudioSpec
  Protected *wav_buffer
  Protected wav_len.l
  Protected cvt.SDL_AudioCVT

  If *context = 0
    ProcedureReturn printSDLError()
  EndIf
   
  If SDL_LoadWAV_RW_(*context, 1, wav_spec, @*wav_buffer, @wav_len) = 0
    ProcedureReturn printSDLError()
  EndIf
 
   If SDL_BuildAudioCVT_(@cvt, wav_spec\format, wav_spec\channels, wav_spec\freq, #AUDIO_S16, 2, 48000) < 0     
     SDL_FreeRW_(*context)
     ProcedureReturn printSDLError()
   EndIf
   
   cvt\len = wav_len
   cvt\buf = AllocateMemory(cvt\len * cvt\len_mult)
   CopyMemory(*wav_buffer, cvt\buf, cvt\len)
   
   If SDL_ConvertAudio_(cvt)
     SDL_FreeRW_(*context)
     ProcedureReturn printSDLError()     
   EndIf
   
   SDL_FreeWAV_(*wav_buffer)
   
   *uData\buffer = cvt\buf
   *uData\len = cvt\len_cvt   
   
EndProcedure

ProcedureC audioCB(*userdata.SDL_Userdata, *stream, len.l)
 
  If *userdata\len < 1
    ProcedureReturn
  EndIf
 
  If len > *userdata\len
    len = *userdata\len
  EndIf
   
  SDL_MixAudio_(*stream, *userdata\buffer + *userdata\pos, len, #SDL_MIX_MAXVOLUME)
 
  *userdata\pos + len
  *userdata\len - len
 
EndProcedure

Procedure main()
  Protected outFor.SDL_AudioSpec
  Protected uData.SDL_Userdata
 
  outFor\freq     = 48000
  outFor\format   = #AUDIO_S16
  outFor\channels = 2
  outFor\samples  = 4096
  outFor\callback = @audioCB()   
  outFor\userdata = uData
 
  If SDL_Init_(#SDL_INIT_AUDIO)
    ProcedureReturn printSDLError()   
  EndIf
 
  If SDL_OpenAudio_(outFor, #Null)
    ProcedureReturn printSDLError()   
  EndIf
 
  loadWave("snd.wav", uData)
 
  SDL_PauseAudio_(0)
 
  While uData\len > 0   
  Wend
 
  SDL_Quit_()
EndProcedure:End main()


:allright:


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

Registriert: 25.03.2013 09:59
Hi!

Ich hätte auch grad mal gemütlich begonnen aus Interesse zur Entbuggung den Code aufzuräumen und zu straffen, aber ...
Super gemacht, Edel und gut einge'Linux't, ccode_new :allright:
Getestet unter PB5.46/x32 mit Ascii UND Unicode.

Das einzige was mir noch aufgefallen ist, um fallweise 'Aussetzer' unter Linux zu vermeiden:
Für 'schrägere' Dateinnamen mit Sonderzeichen bitte noch folgenden Import ändern:
Code:
;von
SDL_RWFromFile_(fileName.p-ascii, mode.p-ascii) As "SDL_RWFromFile"
;in
SDL_RWFromFile_(fileName.p-utf8, mode.p-ascii) As "SDL_RWFromFile"

Grüße 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