Seite 2 von 2

Verfasst: 08.03.2009 01:36
von Skywalker
Komisch!
Wenn ich das von Padraig gezeigte Beispiel so umbaue, das die Initialisierung in eine Procedure gepackt wird, stürzt das Programm ab.
Ändere ich hingegen den Aufruf der Funktionen folgendermaßen ab, dann läuft es.
ergebnis = CallCFunctionFast(*SNDH_Start,file,1)
.....
CallCFunctionFast(*SNDH_Stop)

Ich habe noch andere DLLs getestet, da ist das gleiche Problem.
Solange ich nicht mit Proceduren arbeite, kann ich "CallFunctionFast" nutzen, innerhalb funktioniert es entweder gar nicht, oder ich muss wieder "CallCFunctionFast" benutzen.
Kann mich da mal jemand aufklären? PB-Version übrigens 4.30.

Code: Alles auswählen

Global *SNDH_Start
Global *SNDH_Stop 
Procedure InitOSM(initid,dll.s)
If OpenLibrary(initid, dll.s) 
  *SNDH_Start = GetFunction(0, "playOSMEMusicFile") 
  *SNDH_Stop = GetFunction(0, "stopOSMEMusic") 
EndIf
EndProcedure    
Procedure Play_Song(file.s)
ergebnis = CallFunctionFast(*SNDH_Start,file,1) 
EndProcedure

InitOSM(0,"osmengine.dll")
Play_Song(test.sndh")

If OpenConsole() 
  PrintN("OSMEngine by SLiPPY/VeCTRONiX!") 
  PrintN("Press ESC To exit...") 
  Repeat 
    KeyPressed$ = Inkey() 
    Delay(20)      
  Until KeyPressed$ = Chr(27) 
  
EndIf 
CallFunctionFast(*SNDH_Stop) 
CloseLibrary(0)

Verfasst: 08.03.2009 16:23
von hmi222
Hi!
Bei diesem Beispiel wird die DLL in den Memory geladen (in der EXE integriert).
dafür brauchst du die Lib von PBOSL: LOADDLLMEMORY.
Oder du baust die um.

Wie Xperience2003 schon sagte:
Schau dich hier um:
http://www.dbfinteractive.com/forum/ind ... ,33.0.html
Hier habe wir schon fast alle replayer umgesetzt.
Es lohnt sich umzuschauen!

eNeRGy/dAWN


Example:

Code: Alles auswählen

;/Example by eNeRGy/dAWN
;/ www.dawncreations.com
;/Watch out for the equalizer-functions in the DX_SoundLib-OSME.pbi!


InitSprite()

IncludeFile "..\library\DX_SoundLib-OSME.pbi"
OpenScreen(800,600,32,"OSME-Example for Maxx")
DX_InitOSME()
DX_PlayOSMEMem(?fc,?endfc-?fc)




Repeat 
ClearScreen($402020)
FlipBuffers(0)
Delay(1)
If GetAsyncKeyState_(#VK_ESCAPE)
  DX_StopOSME()
  Break
EndIf
ForEver
End

DataSection
fc:IncludeBinary"..\Music\fc\hippel paradox intro.fc"
endfc:
EndDataSection

Wrapper:

Code: Alles auswählen

;-OSME WRAPPER by eNeRGy /dAWN



Enumeration
  #OSME_SUCCESS=0
  #OSME_FILE_ERROR=-1001
  #OSME_FILE_READ_ERROR=-1002
  #OSME_FILE_MEMORY_ERROR=-1003
  #OSME_FILE_NOT_FOUND_ERROR=-1004
  #OSME_UNKNOWN_REPLAYER=-2001
  #OSME_INITIALIZATION_ERROR=-3001
  #OSME_SOUNDSYSTEM_ERROR=-3002
  #OSME_DISK_VALIDATION_FAILED=-3003
  #OSME_USER_ERROR=-4000
  #OSME_QUALITY_FILTER_OFF=0
  #OSME_QUALITY_FILTER_ON=1
EndEnumeration
 

Structure osme_music_info_t
  title.s {80}
  author.s {60}
  composer.s {60}
  replay.s {40}
  hwname.s {20}
  time_ms.l
  rate.l
  addr.l
  channels.l
  max_vu.l
EndStructure

Structure OSME
  OsmeMusic_Info.osme_music_info_t
  FadeOutTimeMS.l
  ChannelVU.l
  MusicFile.s
  TrackID.l
  Lenght.l
  Volume.l
  QualityFilter.l
  
  ;Pointers
  DllDataPtr.l
  playOSMEMusicMem.l
  playOSMEMusicFile.l
  stopOSMEMusic.l
  PauseOSMEMusic.l
  resumeOSMEMusic.l
  MusicInfo.l
  GetChannelVU.l
  SetQualityFilter.l
  SetVolume.l
  ProcResult.l
  FadeOutVolume.l
EndStructure

Global OSME.OSME

Procedure DX_InitOSME()
  With OSME
    \DllDataPtr=LoadLibraryM(?DLL)
    \playOSMEMusicMem=GetProcAddressM(\DllDataPtr,"playOSMEMusicMem")
    \playOSMEMusicFile=GetProcAddressM(\DllDataPtr,"playOSMEMusicFile")
    \stopOSMEMusic=GetProcAddressM(\DllDataPtr,"stopOSMEMusic")
    \PauseOSMEMusic=GetProcAddressM(\DllDataPtr,"pauseOSMEMusic")
    \resumeOSMEMusic=GetProcAddressM(\DllDataPtr,"resumeOSMEMusic")
    \MusicInfo=GetProcAddressM(\DllDataPtr,"getOSMEMusicInfo")
    \GetChannelVU=GetProcAddressM(\DllDataPtr,"getOSMEChannelVU")
    \SetQualityFilter=GetProcAddressM(\DllDataPtr,"setQualityFilter")
    \SetVolume=GetProcAddressM(\DllDataPtr,"setOSMEVolume")
    \ProcResult=GetProcAddressM(\DllDataPtr,"getProcResult")
    \FadeOutVolume=GetProcAddressM(\DllDataPtr,"fadeOutOSMEVolume")
  EndWith
  
EndProcedure

Procedure DX_PlayOSMEMem(*Song,SongLength.l,SubSong.l=0)
CallCFunctionFast(OSME\playOSMEMusicMem,*Song,SongLength,SubSong)
EndProcedure

Procedure DX_PlayOSMEFile(Song.s,SubSong.l=0)
  CallCFunctionFast(OSME\playOSMEMusicFile,Song,SubSong)
EndProcedure

Procedure DX_StopOSME()
  CallCFunctionFast(OSME\stopOSMEMusic)
EndProcedure

Procedure DX_PauseOSME()
  CallCFunctionFast(OSME\PauseOSMEMusic)
EndProcedure

Procedure DX_ResumeOSME()
  CallCFunctionFast(OSME\resumeOSMEMusic)
EndProcedure


Procedure DX_OSME_MusicInfo(*Info.osme_music_info_t)
  CallCFunctionFast(OSME\MusicInfo,*Info)
EndProcedure

Procedure DX_OSME_GetChannelVU(Channel.l)
  ProcedureReturn CallCFunctionFast(OSME\GetChannelVU,Channel)
EndProcedure


Procedure DX_OSMESetQualityFilter(quality.l=#OSME_QUALITY_FILTER_ON)
   CallCFunctionFast(OSME\SetQualityFilter,quality)
EndProcedure

Procedure DX_OSMESetVolume(Volume.l=100)
  CallCFunctionFast(OSME\SetVolume,Volume)
EndProcedure

Procedure DX_OSMEFadeOutVolume(FadeOutTimeMS.l)
  CallCFunctionFast(OSME\FadeOutVolume,FadeOutTimeMS)
EndProcedure

Procedure DX_OSMEGetProcResult()
  ProcedureReturn CallCFunctionFast(OSME\ProcResult)
EndProcedure



DataSection
DLL:IncludeBinary "..\dll\osmengine.dll"
EndDataSection 
; jaPBe Version=3.7.9.667
; Build=0
; FirstLine=72
; CursorPosition=80
; ExecutableFormat=Windows
; DontSaveDeclare
; EOF

Verfasst: 08.03.2009 16:56
von Thorium
Skywalker hat geschrieben:Komisch!
Wenn ich das von Padraig gezeigte Beispiel so umbaue, das die Initialisierung in eine Procedure gepackt wird, stürzt das Programm ab.
Ändere ich hingegen den Aufruf der Funktionen folgendermaßen ab, dann läuft es.

Ich habe noch andere DLLs getestet, da ist das gleiche Problem.
Solange ich nicht mit Proceduren arbeite, kann ich "CallFunctionFast" nutzen, innerhalb funktioniert es entweder gar nicht, oder ich muss wieder "CallCFunctionFast" benutzen.
Kann mich da mal jemand aufklären? PB-Version übrigens 4.30.
Ist nicht komisch. Du bekommst eine Stack Corruption, weil du die falsche Calling Convention benutzt. Siehe hier: http://www.purebasic.fr/blog/?p=49

Verfasst: 09.03.2009 13:18
von Skywalker
Ahhh, Danke für den Link.
Jetzt habe ich das mit dem Stack-Problem verstanden.

Bei "dbfinteractive.com" habe ich mich auch schon umgeschaut und das ein oder andere umgesetzt.
Aktuell hänge ich bei einer Routine für SID-Sounds, welche sich in einer PB-LIB befindet.
Dort erhalten ich nun auch einen Stack-Fehler, aber mit dem neuen Wissen werde ich das schon hinkriegen. :-)

Mein kleiner Player spielt mittlerweile schon 17 verschiedene Formate aus der guten alten Zeit ab.
Darunter sind natürlich auch die bereits von PB unterstützen Tracker-MODs.

Leider musste ich aber nun feststellen, das die schon von Padraig verlinkte SC68-Lib nicht alle *.sc68 Dateien abspielen kann.
So wie ich das sehe, gibt es in einigen der Files "Chunks", mit welcher die LIB nicht klar zu kommen scheint.
Mal sehen wie es weiter geht.

Nochmals danke an euch allen.

Gruß
Thomas