Ich wollt aber bevor ich aufgebe euch fragen ob es doch irgentwo einen Code entpacken der Daten gibt, also für das audio/x-pn-realaudio-Format.
Wär total nett, dann bräucht ich nämlich den doofen Realplayer nichtmehr und andere Leute wären warscheinlich auch froh über das PlugIn
Für alle die auch mal ein WinampPlugin machen wollen:
Ist zwar wegen dem obrigen Prob nich fertig, aber Datei-Infos können schon ausgelesen werden.
Code: Alles auswählen
; Winamp-InputPlugin by Deeém2031
#IN_VER = $100
#OUT_VER = $10
Structure Out_Module
Version.l ; module version (OUT_VER)
Description.s ; description of module, with version string
id.l ; module id. each input module gets its own. non-nullsoft modules should be >= 65536.
hMainWindow.l ; winamp's main window (filled in by winamp)
hDllInstance.l ; DLL instance handle (filled in by winamp)
Config.l ; configuration dialog
About.l ; about dialog
init.l ; called when loaded
quit.l ; called when unloaded
Open.l ; returns >=0 on success, <0 on failure
; NOTENOTENOTE: bufferlenms And prebufferms are ignored in most If not all output plug-ins.
; ... so don't expect the max latency returned to be what you asked for.
; returns max latency in ms (0 For diskwriters, etc)
; bufferlenms And prebufferms must be in ms. 0 To use defaults.
; prebufferms must be <= bufferlenms
Close.l ; close the ol' output device.
Write.l ; 0 on success. len == bytes To write (<= 8192 always). buf is straight audio Data.
; 1 returns not able To write (yet). Non-blocking, always.
CanWrite.l ; returns number of bytes possible to write at a given time.
; Never will decrease unless you call write (Or Close, heh)
IsPlaying.l ; non0 if output is still going or if data in buffers waiting to be
; written (i.e. closing While IsPlaying() returns 1 would truncate the song
pause.l ; returns previous pause state
setvolume.l ; volume is 0-255
setpan.l ; pan is -128 to 128
Flush.l ; flushes buffers and restarts output at time t (in ms)
; (used For seeking)
getoutputtime.l ; returns played time in MS
GetWrittenTime.l ; returns time written in MS (used for synching up vis stuff)
EndStructure
Structure In_Module
Version.l ; #IN_VER
Description.s
hMainWindow.l
hDllInstance.l
FileExtensions.l
is_seekable.l
UseOutputPlug.l
Config.l ;Pointer zur Config-Proc
About.l
init.l
quit.l
getinfofile.l
infobox.l
isourfile.l
play.l
pause.l
unpause.l
ispaused.l
stop.l
getlength.l
getoutputtime.l
setoutputtime.l
setvolume.l
setpan.l
SAVSAInit.l
SAVSADeInit.l
SAAddPCMData.l
SAGetMode.l
SAAdd.l
VSAAddPCMData.l
VSAGetMode.l
VSAAdd.l
VSASetInfo.l
dsp_isactive.l
dsp_dosamples.l
EQSet.l
setinfo.l
outMod.Out_Module; filled in by winamp, optionally used :)
EndStructure
Structure eqData_struc
c.b[10]
EndStructure
Global mod.In_Module, paused, ReadBuffer
Global FileID, MaxLatency
Global RMFHeaderSize,RMFHeaderObjectVersion,RMFHeaderFileVersion,RMFHeaderNumHeaders
Global MAXBitrate, AVGBitrate, duration, CurrentTitle.s
Procedure BSwap(a.l)
!BSWAP Eax
ProcedureReturn
EndProcedure
Procedure BSWAPw(a.l)
!SHL Eax, 16
!BSWAP Eax
ProcedureReturn
EndProcedure
ProcedureCDLL config(hWndParent.l)
MessageBox_(hWndParent, "No configuration.", "Configuration",#MB_OK)
EndProcedure
ProcedureCDLL about(hWndParent.l)
MessageBox_(hWndParent,"RealMedia Player, by Deeém2031 (Dietmer Schölzel)","About RM Player",#MB_OK)
EndProcedure
ProcedureCDLL Init()
ProcedureReturn 0
EndProcedure
ProcedureCDLL quit()
EndProcedure
ProcedureCDLL.l isourfile(fn.s)
If LCase(GetExtensionPart(fn)) = "rm" Or LCase(GetExtensionPart(fn)) = "ra" Or LCase(GetExtensionPart(fn)) = "rma"
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
ProcedureCDLL.l play(fn.s)
Protected rBuffer.l, HeaderObjVersion, HeaderBuff, HeaderBuffSize
ProcedureReturn 1
FileID = ReadFile(#PB_Any,fn)
If FileID = 0
ProcedureReturn 1
EndIf
ReadData(@rBuffer,4)
If PeekS(@rBuffer,4) <> ".RMF"
CloseFile(FileID)
ProcedureReturn 1
EndIf
RMFHeaderSize = BSwap(ReadLong())
RMFHeaderObjectVersion = BSWAPw(ReadWord())
If RMFHeaderObjectVersion = 0
RMFHeaderFileVersion = BSwap(ReadLong())
RMFHeaderNumHeaders = BSwap(ReadLong())
EndIf
Repeat
ReadData(@rBuffer,4)
If PeekS(@rBuffer,4) = "PROP" ;{
ReadLong()
HeaderObjVersion = BSWAPw(ReadWord())
If HeaderObjVersion = 0
MAXBitrate = BSwap(ReadLong())
AVGBitrate = BSwap(ReadLong())
ReadLong();msg + "MAX_Packet_Size: "+Str(BSwap(ReadLong()))+Chr(13)+Chr(10)
ReadLong();msg + "AVG_Packet_Size: "+Str(BSwap(ReadLong()))+Chr(13)+Chr(10)
ReadLong();msg + "NUM_Packets: "+Str(BSwap(ReadLong()))+Chr(13)+Chr(10)
duration = BSwap(ReadLong())
ReadLong();msg + "Preroll: "+Str(BSwap(ReadLong()))+Chr(13)+Chr(10)
ReadLong();msg + "Index_Offset: "+Str(BSwap(ReadLong()))+Chr(13)+Chr(10)
ReadLong();msg + "Data_Offset: "+Str(BSwap(ReadLong()))+Chr(13)+Chr(10)
ReadWord();msg + "Num_Streams: "+Str(BSWAPw(ReadWord()))+Chr(13)+Chr(10)
ReadWord();msg + "Flags: "+Str(BSWAPw(ReadWord()))+Chr(13)+Chr(10)
EndIf ;}
ElseIf PeekS(@rBuffer,4) = "CONT" ;{
ReadLong();msg + "CONTHeaderSize: "+Str(BSwap(ReadLong()))+Chr(13)+Chr(10)
HeaderObjVersion = BSWAPw(ReadWord())
If HeaderObjVersion = 0
HeaderBuffSize = ReadByte()
If HeaderBuffSize
HeaderBuff = AllocateMemory(HeaderBuffSize)
ReadData(HeaderBuff,HeaderBuffSize)
CurrentTitle = PeekS(HeaderBuff,HeaderBuffSize)
FreeMemory(HeaderBuff)
Else
CurrentTitle = GetFilePart(fn)
EndIf
HeaderBuffSize = ReadByte()
HeaderBuff = AllocateMemory(HeaderBuffSize)
ReadData(HeaderBuff,HeaderBuffSize)
;msg + "Author: "+PeekS(InfoHeaderBuff,InfoHeaderBuffSize)+Chr(13)+Chr(10)
FreeMemory(HeaderBuff)
HeaderBuffSize = ReadByte()
HeaderBuff = AllocateMemory(HeaderBuffSize)
ReadData(HeaderBuff,HeaderBuffSize)
;msg + "Copyright: "+PeekS(InfoHeaderBuff,InfoHeaderBuffSize)+Chr(13)+Chr(10)
FreeMemory(HeaderBuff)
HeaderBuffSize = ReadByte()
HeaderBuff = AllocateMemory(HeaderBuffSize)
ReadData(HeaderBuff,HeaderBuffSize)
;msg + "Comment: "+PeekS(InfoHeaderBuff,InfoHeaderBuffSize)+Chr(13)+Chr(10)
FreeMemory(HeaderBuff)
EndIf ;}
EndIf
Until Eof(FileID)
paused = 0
If mod\outMod\Open
;CallCFunctionFast(mod\outMod\Open,)
EndIf
CloseFile(FileID); tmp
ProcedureReturn 0
EndProcedure
ProcedureCDLL pause()
paused = #True
If mod\outMod\pause
CallCFunctionFast(mod\outMod\pause,#True)
EndIf
EndProcedure
ProcedureCDLL unpause()
paused = #False
If mod\outMod\pause
CallCFunctionFast(mod\outMod\pause,#False)
EndIf
EndProcedure
ProcedureCDLL.l ispaused()
ProcedureReturn paused
EndProcedure
ProcedureCDLL stop()
;-
EndProcedure
ProcedureCDLL.l getlength()
ProcedureReturn duration
EndProcedure
ProcedureCDLL.l getoutputtime()
If mod\outMod\getoutputtime
ProcedureReturn CallCFunctionFast(mod\outMod\getoutputtime)
EndIf
EndProcedure
ProcedureCDLL setoutputtime(time_in_ms.l)
EndProcedure
ProcedureCDLL setvolume(volume.l)
If mod\outMod\setvolume
CallCFunctionFast(mod\outMod\setvolume,volume)
EndIf
EndProcedure
ProcedureCDLL setpan(pan.l)
If mod\outMod\setpan
CallCFunctionFast(mod\outMod\setpan,pan)
EndIf
EndProcedure
ProcedureCDLL infoDlg(fn.s, hwnd)
Protected InfoFileID.l, rBuffer.l, msg.s
Protected InfoHeaderObjVersion, InfoHeaderStreamNameSize.l, InfoHeaderStreamName, InfoHeaderMimeType, InfoHeaderMimeTypeSize, InfoHeaderType, InfoHeaderTypeSize
Protected InfoHeaderBuff, InfoHeaderBuffSize, ChunkSize
InfoFileID = ReadFile(#PB_Any,fn)
If InfoFileID = 0
ProcedureReturn
EndIf
ReadData(@rBuffer,4)
If PeekS(@rBuffer,4) <> ".RMF"
CloseFile(InfoFileID)
MessageBox_(hwnd,"None RM-File!","Info "+Chr(34)+GetFilePart(fn)+Chr(34),#MB_OK)
ProcedureReturn
EndIf
msg + "MAINHeaderSize: "+Str(BSwap(ReadLong()))+Chr(13)+Chr(10)
InfoHeaderObjVersion = BSWAPw(ReadWord())
msg + "MAINHeaderObjectVersion: "+Str(InfoHeaderObjVersion)+Chr(13)+Chr(10)
If InfoHeaderObjVersion = 0
msg + "FileVersion: "+Str(BSwap(ReadLong()))+Chr(13)+Chr(10)
msg + "NumHeaders: "+Str(BSwap(ReadLong()))+Chr(13)+Chr(10)
EndIf
Repeat
ReadData(@rBuffer,4)
If PeekS(@rBuffer,4) = "PROP" ;{
msg + Chr(13)+Chr(10)
msg + "PROPHeaderSize: "+Str(BSWAP(ReadLong()))+Chr(13)+Chr(10)
InfoHeaderObjVersion = BSWAPw(ReadWord())
msg + "PROPHeaderObjectVersion: "+Str(InfoHeaderObjVersion)+Chr(13)+Chr(10)
If InfoHeaderObjVersion = 0
msg + "MAX_Bitrate: "+Str(BSWAP(ReadLong()))+Chr(13)+Chr(10)
msg + "AVG_Bitrate: "+Str(BSWAP(ReadLong()))+Chr(13)+Chr(10)
msg + "MAX_Packet_Size: "+Str(BSWAP(ReadLong()))+Chr(13)+Chr(10)
msg + "AVG_Packet_Size: "+Str(BSWAP(ReadLong()))+Chr(13)+Chr(10)
msg + "NUM_Packets: "+Str(BSWAP(ReadLong()))+Chr(13)+Chr(10)
msg + "Duration: "+Str(BSWAP(ReadLong()))+Chr(13)+Chr(10)
msg + "Preroll: "+Str(BSWAP(ReadLong()))+Chr(13)+Chr(10)
msg + "Index_Offset: "+Str(BSWAP(ReadLong()))+Chr(13)+Chr(10)
msg + "Data_Offset: "+Str(BSWAP(ReadLong()))+Chr(13)+Chr(10)
msg + "Num_Streams: "+Str(BSWAPw(ReadWord()))+Chr(13)+Chr(10)
msg + "Flags: "+Str(BSWAPw(ReadWord()))+Chr(13)+Chr(10)
EndIf ;}
ElseIf PeekS(@rBuffer,4) = "MDPR" ;{
msg + Chr(13)+Chr(10)
msg + "MDRPHeaderSize: "+Str(BSwap(ReadLong()))+Chr(13)+Chr(10)
InfoHeaderObjVersion = BSWAPw(ReadWord())
msg + "MDRPHeaderObjectVersion: "+Str(InfoHeaderObjVersion)+Chr(13)+Chr(10)
If InfoHeaderObjVersion = 0
msg + "Streamnumber: "+Str(BSWAPw(ReadWord()))+Chr(13)+Chr(10)
msg + "MAX_Bitrate: "+Str(BSwap(ReadLong()))+Chr(13)+Chr(10)
msg + "AVG_Bitrate: "+Str(BSwap(ReadLong()))+Chr(13)+Chr(10)
msg + "MAX_Packet_Size: "+Str(BSwap(ReadLong()))+Chr(13)+Chr(10)
msg + "AVG_Packet_Size: "+Str(BSwap(ReadLong()))+Chr(13)+Chr(10)
msg + "StartTime: "+Str(BSwap(ReadLong()))+Chr(13)+Chr(10)
msg + "Preroll: "+Str(BSwap(ReadLong()))+Chr(13)+Chr(10)
msg + "Duration: "+Str(BSwap(ReadLong()))+Chr(13)+Chr(10)
InfoHeaderStreamNameSize = ReadByte()
InfoHeaderStreamName = AllocateMemory(InfoHeaderStreamNameSize)
ReadData(InfoHeaderStreamName,InfoHeaderStreamNameSize)
msg + "StreamName: "+PeekS(InfoHeaderStreamName,InfoHeaderStreamNameSize)+Chr(13)+Chr(10)
FreeMemory(InfoHeaderStreamName)
InfoHeaderMimeTypeSize = ReadByte()
InfoHeaderMimeType = AllocateMemory(InfoHeaderMimeTypeSize)
ReadData(InfoHeaderMimeType,InfoHeaderMimeTypeSize)
msg + "MimeType: "+PeekS(InfoHeaderMimeType,InfoHeaderMimeTypeSize)+Chr(13)+Chr(10)
FreeMemory(InfoHeaderMimeType)
InfoHeaderTypeSize = BSwap(ReadLong())
If InfoHeaderTypeSize
InfoHeaderType = AllocateMemory(InfoHeaderTypeSize)
ReadData(InfoHeaderType,InfoHeaderTypeSize)
msg + "TypeData: "+PeekS(InfoHeaderType,InfoHeaderTypeSize)+Chr(13)+Chr(10)
FreeMemory(InfoHeaderType)
EndIf
EndIf ;}
ElseIf PeekS(@rBuffer,4) = "CONT" ;{
msg + Chr(13)+Chr(10)
msg + "CONTHeaderSize: "+Str(BSWAP(ReadLong()))+Chr(13)+Chr(10)
InfoHeaderObjVersion = BSWAPw(ReadWord())
msg + "CONTHeaderObjectVersion: "+Str(InfoHeaderObjVersion)+Chr(13)+Chr(10)
If InfoHeaderObjVersion = 0
InfoHeaderBuffSize = ReadByte()
InfoHeaderBuff = AllocateMemory(InfoHeaderBuffSize)
ReadData(InfoHeaderBuff,InfoHeaderBuffSize)
msg + "Title: "+PeekS(InfoHeaderBuff,InfoHeaderBuffSize)+Chr(13)+Chr(10)
FreeMemory(InfoHeaderBuff)
InfoHeaderBuffSize = ReadByte()
InfoHeaderBuff = AllocateMemory(InfoHeaderBuffSize)
ReadData(InfoHeaderBuff,InfoHeaderBuffSize)
msg + "Author: "+PeekS(InfoHeaderBuff,InfoHeaderBuffSize)+Chr(13)+Chr(10)
FreeMemory(InfoHeaderBuff)
InfoHeaderBuffSize = ReadByte()
InfoHeaderBuff = AllocateMemory(InfoHeaderBuffSize)
ReadData(InfoHeaderBuff,InfoHeaderBuffSize)
msg + "Copyright: "+PeekS(InfoHeaderBuff,InfoHeaderBuffSize)+Chr(13)+Chr(10)
FreeMemory(InfoHeaderBuff)
InfoHeaderBuffSize = ReadByte()
InfoHeaderBuff = AllocateMemory(InfoHeaderBuffSize)
ReadData(InfoHeaderBuff,InfoHeaderBuffSize)
msg + "Comment: "+PeekS(InfoHeaderBuff,InfoHeaderBuffSize)+Chr(13)+Chr(10)
FreeMemory(InfoHeaderBuff)
EndIf ;}
ElseIf PeekS(@rBuffer,4) = "DATA" ;{
msg + Chr(13)+Chr(10)
ChunkSize = BSwap(ReadLong())
msg + "DATAChunkSize: "+Str(ChunkSize)+Chr(13)+Chr(10)
InfoHeaderObjVersion = BSWAPw(ReadWord())
msg + "DATAHeaderObjectVersion: "+Str(InfoHeaderObjVersion)+Chr(13)+Chr(10)
If InfoHeaderObjVersion = 0
msg + "Num_Packets: "+Str(BSwap(ReadLong()))+Chr(13)+Chr(10)
msg + "Next_Data_Header: "+Str(BSwap(ReadLong()))+Chr(13)+Chr(10)
EndIf
FileSeek(Loc()+ChunkSize-(4+4+2+4+4));}
ElseIf PeekS(@rBuffer,4) = "INDX" ;{
msg + Chr(13)+Chr(10)
msg + "INDXHeaderSize: "+Str(BSWAP(ReadLong()))+Chr(13)+Chr(10)
InfoHeaderObjVersion = BSWAPw(ReadWord())
msg + "INDXHeaderObjectVersion: "+Str(InfoHeaderObjVersion)+Chr(13)+Chr(10)
If InfoHeaderObjVersion = 0
msg + "Num_Records: "+Str(BSWAP(ReadLong()))+Chr(13)+Chr(10)
msg + "Streamnumber: "+Str(BSWAPw(ReadWord()))+Chr(13)+Chr(10)
msg + "Next_INDX_Header: "+Str(BSWAP(ReadLong()))+Chr(13)+Chr(10)
EndIf ;}
EndIf
Until Eof(InfoFileID)
CloseFile(InfoFileID); tmp
MessageBox_(hwnd,msg,"Info "+Chr(34)+GetFilePart(fn)+Chr(34),#MB_OK)
EndProcedure
ProcedureCDLL getfileinfo(filename.s, *title.STRING, *length_in_ms.LONG)
Protected InfoFileID, rBuffer, wlength, wtitle, InfoHeaderBuff, InfoHeaderBuffSize, InfoHeaderObjVersion, ChunkSize
InfoFileID = ReadFile(#PB_Any,filename)
If InfoFileID = 0
ProcedureReturn
EndIf
ReadData(@rBuffer,4)
If PeekS(@rBuffer,4) <> ".RMF"
CloseFile(InfoFileID)
*title\s = "None RMF-File!"
*length_in_ms\l = 0
ProcedureReturn
EndIf
ReadLong()
ReadWord()
ReadLong()
ReadLong()
If *title = 0
wtitle = 1
Else
tmp.s = GetFilePart(filename)
CopyMemory(@tmp,*title,Len(tmp))
wtitle = 0
EndIf
If *length_in_ms = 0
wlength = 1
Else
wlength = 0
EndIf
Repeat
ReadData(@rBuffer,4)
If PeekS(@rBuffer,4) = "PROP" ;{
ReadLong()
InfoHeaderObjVersion = BSWAPw(ReadWord())
If InfoHeaderObjVersion = 0
ReadLong()
ReadLong()
ReadLong()
ReadLong()
ReadLong()
If *length_in_ms
*length_in_ms\l = BSwap(ReadLong())
Else
ReadLong()
EndIf
ReadLong()
ReadLong()
ReadLong()
ReadLong()
ReadLong()
wlength = 1
EndIf ;}
ElseIf PeekS(@rBuffer,4) = "MDPR"
FileSeek(Loc()+BSwap(ReadLong())-8)
ElseIf PeekS(@rBuffer,4) = "CONT" ;{
ReadLong()
InfoHeaderObjVersion = BSWAPw(ReadWord())
If InfoHeaderObjVersion = 0
InfoHeaderBuffSize = ReadByte()
If InfoHeaderBuffSize
InfoHeaderBuff = AllocateMemory(InfoHeaderBuffSize)
ReadData(InfoHeaderBuff,InfoHeaderBuffSize)
If *title
tmp.s = PeekS(InfoHeaderBuff,InfoHeaderBuffSize)
CopyMemory(@tmp,*title,Len(tmp))
EndIf
FreeMemory(InfoHeaderBuff)
Else
If *title
tmp.s = GetFilePart(filename)
CopyMemory(@tmp,*title,Len(tmp))
EndIf
EndIf
wtitle = 1
InfoHeaderBuffSize = ReadByte()
InfoHeaderBuff = AllocateMemory(InfoHeaderBuffSize)
ReadData(InfoHeaderBuff,InfoHeaderBuffSize)
FreeMemory(InfoHeaderBuff)
InfoHeaderBuffSize = ReadByte()
InfoHeaderBuff = AllocateMemory(InfoHeaderBuffSize)
ReadData(InfoHeaderBuff,InfoHeaderBuffSize)
FreeMemory(InfoHeaderBuff)
InfoHeaderBuffSize = ReadByte()
InfoHeaderBuff = AllocateMemory(InfoHeaderBuffSize)
ReadData(InfoHeaderBuff,InfoHeaderBuffSize)
FreeMemory(InfoHeaderBuff)
EndIf ;}
ElseIf PeekS(@rBuffer,4) = "DATA" ;{
ChunkSize = BSwap(ReadLong())
InfoHeaderObjVersion = BSWAPw(ReadWord())
If InfoHeaderObjVersion = 0
ReadLong()
ReadLong()
EndIf
FileSeek(Loc()+ChunkSize-(4+4+2+4+4));}
ElseIf PeekS(@rBuffer,4) = "INDX"
FileSeek(Loc()+BSwap(ReadLong())-8)
EndIf
Until Eof(InfoFileID) Or (wtitle And wlength)
CloseFile(InfoFileID)
EndProcedure
ProcedureCDLL eq_set(on.l, *eqData.eqData_struc, preamp.l)
EndProcedure
ProcedureDLL.l winampGetInModule2()
mod\Version = #IN_VER
mod\Description = "RM Player v0.0 (x86)"
mod\hMainWindow = 0
mod\hDllInstance = 0
mod\FileExtensions = ?FileExtensions
mod\is_seekable = 1
mod\UseOutputPlug = 1
mod\Config = @config()
mod\About = @about()
mod\init = @Init()
mod\quit = @quit()
mod\getinfofile = @getfileinfo()
mod\infobox = @infoDlg()
mod\isourfile = @isourfile()
mod\play = @play()
mod\pause = @pause()
mod\unpause = @unpause()
mod\ispaused = @ispaused()
mod\stop = @stop()
mod\getlength = @getlength()
mod\getoutputtime = @getoutputtime()
mod\setoutputtime = @setoutputtime()
mod\setvolume = @setvolume()
mod\setpan = @setpan()
mod\SAVSAInit = 0
mod\SAVSADeInit = 0
mod\SAAddPCMData = 0
mod\SAGetMode = 0
mod\SAAdd = 0
mod\VSAAddPCMData = 0
mod\VSAGetMode = 0
mod\VSAAdd = 0
mod\VSASetInfo = 0
mod\dsp_isactive = 0
mod\dsp_dosamples = 0
mod\EQSet = @eq_set()
mod\setinfo = #Null
ProcedureReturn @mod
EndProcedure
DataSection
FileExtensions:
Data.s "RM"
Data.s "RM Audio File (*.rm)"
Data.b 0
EndDataSection