Re: Wie Struktur aus C-Lib in PB importieren
Verfasst: 12.02.2018 01:30
Kannst du dafür nicht einen eigenen Thread machen? Das passt jetzt nicht wirklich zu "Wie Struktur aus C-Lib in PB importieren"
Das deutsche PureBasic-Forum
http://forums.purebasic.com/german/
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
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
Code: Alles auswählen
soundx.SDL_RWops ;?????
If ( SDL_LoadWAV_(soundx, @wave, @daten, @len) <> #Null )
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
Code: Alles auswählen
format\freq = 22050
format\format = #AUDIO_S16
format\channels = 2
format\samples = 512
format\callback = @audiomix()
format\userdata = #Null
Code: Alles auswählen
Procedure.i sub(*userdata, *stream.Ascii, len.l)
EndProcedure
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
-->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
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
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