MP3 Daten auslesen(Header, Frames, ID3v1, ID3v1E, ID3v2.2.0)

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Xaymar

ehemals "Cgamer"

Betreff: MP3 Daten auslesen(Header, Frames, ID3v1, ID3v1E, ID3v2.2.0)

BeitragDo, Feb 03, 2011 20:22
Antworten mit Zitat
Benutzer-Profile anzeigen
So da ich ja gesagt habe, das ID3v2 unterstützung reinkommt, habe ich nun ID3v2.2.0 eingebaut.
Nun werden auch Frames(deren Daten) ausgelesen und mehrere MP3Header(Laut einigen Formatbeschreibungen kann eine MP3 Datei recht viele haben, immer nach jedem Frame).

Unterstützt nun: ID3v2.2.0 ID3v1 ID3v1 Extended

Fehler könnt ihr über IMP3_LastError und IMP3_LastErrorDesc auslesen. Zurückgegeben wird ein MP3Data eintrag, der mit weiteren anderen Einträgen verlinkt ist.

BlitzBasic: [AUSKLAPPEN]
;Type Based IMP3
Const IMP3_ERROR_SUCCESS = %00000000000000000000000000000000
Const IMP3_ERROR_FILEINVALID = %11111111111111111111111111111111
Const IMP3_ERROR_OPENSTREAMFAILED = %11111111111111111111111111111110
Const IMP3_ERROR_UNEXPECTEDENDOFSTREAM = %11111111111111111111111111111101
Const IMP3_ERROR_ID3V2VERSIONUNKNOWN = %11111111111111111111111111111011
Const IMP3_HEADER_VERSION_MPEG25 = %00
Const IMP3_HEADER_VERSION_RESERVED = %01
Const IMP3_HEADER_VERSION_MPEG2 = %10
Const IMP3_HEADER_VERSION_MPEG1 = %11
Const IMP3_HEADER_LAYER_RESERVED = %00
Const IMP3_HEADER_LAYER_LAYER3 = %01
Const IMP3_HEADER_LAYER_LAYER2 = %10
Const IMP3_HEADER_LAYER_LAYER1 = %11
Const IMP3_HEADER_PROTECTED_BYCRC = %0
Const IMP3_HEADER_PROTECTED_NONE = %1
Const IMP3_HEADER_PADDING_ADDFRAMEBIT = %1
Const IMP3_HEADER_PADDING_NONE = %0
Const IMP3_HEADER_MODE_STEREO = %00
Const IMP3_HEADER_MODE_JOINTSTEREO = %01
Const IMP3_HEADER_MODE_DUALCHANNEL = %10
Const IMP3_HEADER_MODE_SINGLECHANNEL = %11
Const IMP3_HEADER_MODEEXTENSION_LR_LR = %00
Const IMP3_HEADER_MODEEXTENSION_LR_I = %01
Const IMP3_HEADER_MODEEXTENSION_MS_LR = %10
Const IMP3_HEADER_MODEEXTENSION_MS_I = %11
Const IMP3_HEADER_COPYRIGHT_IS = %1
Const IMP3_HEADER_COPYRIGHT_ISNOT = %0
Const IMP3_HEADER_ORIGINAL_IS = %1
Const IMP3_HEADER_ORIGINAL_ISNOT = %0
Const IMP3_HEADER_EMPHASIS_NONE = %00
Const IMP3_HEADER_EMPHASIS_50_15MS = %01
Const IMP3_HEADER_EMPHASIS_RESERVED = %10
Const IMP3_HEADER_EMPHASIS_CCIT_J17 = %11
Const IMP3_ID3V1_YEAR_NOYEAR = 538976288
Dim IMP3_BITRATEINDEX(15,3,1), IMP3_SAMPLINGRATEINDEX(2,3), IMP3_GENREINDEX$(255)
IMP3_BITRATEINDEX( 1,1,0) = 32:IMP3_BITRATEINDEX( 2,1,0) = 64:IMP3_BITRATEINDEX( 3,1,0) = 96:IMP3_BITRATEINDEX( 4,1,0) = 128:IMP3_BITRATEINDEX( 5,1,0) = 160:IMP3_BITRATEINDEX( 6,1,0) = 192:IMP3_BITRATEINDEX( 7,1,0) = 224:IMP3_BITRATEINDEX( 8,1,0) = 256:IMP3_BITRATEINDEX( 9,1,0) = 288:IMP3_BITRATEINDEX(10,1,0) = 320:IMP3_BITRATEINDEX(11,1,0) = 352:IMP3_BITRATEINDEX(12,1,0) = 384:IMP3_BITRATEINDEX(13,1,0) = 416:IMP3_BITRATEINDEX(14,1,0) = 448:IMP3_BITRATEINDEX( 15,1,0) = -1
IMP3_BITRATEINDEX( 1,2,0) = 32:IMP3_BITRATEINDEX( 2,2,0) = 48:IMP3_BITRATEINDEX( 3,2,0) = 56:IMP3_BITRATEINDEX( 4,2,0) = 64:IMP3_BITRATEINDEX( 5,2,0) = 80:IMP3_BITRATEINDEX( 6,2,0) = 96:IMP3_BITRATEINDEX( 7,2,0) = 112:IMP3_BITRATEINDEX( 8,2,0) = 128:IMP3_BITRATEINDEX( 9,2,0) = 160:IMP3_BITRATEINDEX(10,2,0) = 192:IMP3_BITRATEINDEX(11,2,0) = 224:IMP3_BITRATEINDEX(12,2,0) = 256:IMP3_BITRATEINDEX(13,2,0) = 320:IMP3_BITRATEINDEX(14,2,0) = 384:IMP3_BITRATEINDEX( 15,2,0) = -1
IMP3_BITRATEINDEX( 1,3,0) = 32:IMP3_BITRATEINDEX( 2,3,0) = 40:IMP3_BITRATEINDEX( 3,3,0) = 48:IMP3_BITRATEINDEX( 4,3,0) = 56:IMP3_BITRATEINDEX( 5,3,0) = 64:IMP3_BITRATEINDEX( 6,3,0) = 80:IMP3_BITRATEINDEX( 7,3,0) = 96:IMP3_BITRATEINDEX( 8,3,0) = 112:IMP3_BITRATEINDEX( 9,3,0) = 128:IMP3_BITRATEINDEX(10,3,0) = 160:IMP3_BITRATEINDEX(11,3,0) = 192:IMP3_BITRATEINDEX(12,3,0) = 224:IMP3_BITRATEINDEX(13,3,0) = 256:IMP3_BITRATEINDEX(14,3,0) = 320:IMP3_BITRATEINDEX( 15,3,0) = -1
IMP3_BITRATEINDEX( 1,1,1) = 32:IMP3_BITRATEINDEX( 2,1,1) = 48:IMP3_BITRATEINDEX( 3,1,1) = 56:IMP3_BITRATEINDEX( 4,1,1) = 64:IMP3_BITRATEINDEX( 5,1,1) = 80:IMP3_BITRATEINDEX( 6,1,1) = 96:IMP3_BITRATEINDEX( 7,1,1) = 112:IMP3_BITRATEINDEX( 8,1,1) = 128:IMP3_BITRATEINDEX( 9,1,1) = 144:IMP3_BITRATEINDEX(10,1,1) = 160:IMP3_BITRATEINDEX(11,1,1) = 176:IMP3_BITRATEINDEX(12,1,1) = 192:IMP3_BITRATEINDEX(13,1,1) = 224:IMP3_BITRATEINDEX(14,1,1) = 256:IMP3_BITRATEINDEX( 15,1,1) = -1
IMP3_BITRATEINDEX( 1,2,1) = 8:IMP3_BITRATEINDEX( 2,2,1) = 16:IMP3_BITRATEINDEX( 3,2,1) = 24:IMP3_BITRATEINDEX( 4,2,1) = 32:IMP3_BITRATEINDEX( 5,2,1) = 40:IMP3_BITRATEINDEX( 6,2,1) = 48:IMP3_BITRATEINDEX( 7,2,1) = 56:IMP3_BITRATEINDEX( 8,2,1) = 64:IMP3_BITRATEINDEX( 9,2,1) = 80:IMP3_BITRATEINDEX(10,2,1) = 96:IMP3_BITRATEINDEX(11,2,1) = 112:IMP3_BITRATEINDEX(12,2,1) = 128:IMP3_BITRATEINDEX(13,2,1) = 144:IMP3_BITRATEINDEX(14,2,1) = 160:IMP3_BITRATEINDEX( 15,2,1) = -1
IMP3_BITRATEINDEX( 1,3,1) = 8:IMP3_BITRATEINDEX( 2,3,1) = 16:IMP3_BITRATEINDEX( 3,3,1) = 24:IMP3_BITRATEINDEX( 4,3,1) = 32:IMP3_BITRATEINDEX( 5,3,1) = 40:IMP3_BITRATEINDEX( 6,3,1) = 48:IMP3_BITRATEINDEX( 7,3,1) = 56:IMP3_BITRATEINDEX( 8,3,1) = 64:IMP3_BITRATEINDEX( 9,3,1) = 80:IMP3_BITRATEINDEX(10,3,1) = 96:IMP3_BITRATEINDEX(11,3,1) = 112:IMP3_BITRATEINDEX(12,3,1) = 128:IMP3_BITRATEINDEX(13,3,1) = 144:IMP3_BITRATEINDEX(14,3,1) = 160:IMP3_BITRATEINDEX( 15,3,1) = -1
IMP3_SAMPLINGRATEINDEX(0,0) = 44100:IMP3_SAMPLINGRATEINDEX(0,1) = 48000:IMP3_SAMPLINGRATEINDEX(0,2) = 32000:IMP3_SAMPLINGRATEINDEX(0,3) = -1
IMP3_SAMPLINGRATEINDEX(1,0) = 22050:IMP3_SAMPLINGRATEINDEX(1,1) = 24000:IMP3_SAMPLINGRATEINDEX(1,2) = 16000:IMP3_SAMPLINGRATEINDEX(1,3) = -1
IMP3_SAMPLINGRATEINDEX(2,0) = 11025:IMP3_SAMPLINGRATEINDEX(2,1) = 12000:IMP3_SAMPLINGRATEINDEX(2,2) = 8000:IMP3_SAMPLINGRATEINDEX(2,3) = -1
IMP3_GENREINDEX(0) = "Blues":IMP3_GENREINDEX(1) = "Classic Rock":IMP3_GENREINDEX(2) = "Country":IMP3_GENREINDEX(3) = "Dance":IMP3_GENREINDEX(4) = "Disco":IMP3_GENREINDEX(5) = "Funk":IMP3_GENREINDEX(6) = "Grunge":IMP3_GENREINDEX(7) = "Hip-Hop":IMP3_GENREINDEX(8) = "Jazz":IMP3_GENREINDEX(9) = "Metal":IMP3_GENREINDEX(10) = "New Age":IMP3_GENREINDEX(11) = "Oldies":IMP3_GENREINDEX(12) = "Other":IMP3_GENREINDEX(13) = "Pop":IMP3_GENREINDEX(14) = "R&B":IMP3_GENREINDEX(15) = "Rap":IMP3_GENREINDEX(16) = "Reggae":IMP3_GENREINDEX(17) = "Rock":IMP3_GENREINDEX(18) = "Techno":IMP3_GENREINDEX(19) = "Industrial"
IMP3_GENREINDEX(20) = "Alternative":IMP3_GENREINDEX(21) = "Ska":IMP3_GENREINDEX(22) = "Death Metal":IMP3_GENREINDEX(23) = "Pranks":IMP3_GENREINDEX(24) = "Soundtrack":IMP3_GENREINDEX(25) = "Euro-Techno":IMP3_GENREINDEX(26) = "Ambient":IMP3_GENREINDEX(27) = "Trip-Hop":IMP3_GENREINDEX(28) = "Vocal":IMP3_GENREINDEX(29) = "Jazz+funk"
IMP3_GENREINDEX(30) = "Fusion":IMP3_GENREINDEX(31) = "Trance":IMP3_GENREINDEX(32) = "Classical":IMP3_GENREINDEX(33) = "Instrumental":IMP3_GENREINDEX(34) = "Acid":IMP3_GENREINDEX(35) = "House":IMP3_GENREINDEX(36) = "Game":IMP3_GENREINDEX(37) = "Sound Clip":IMP3_GENREINDEX(38) = "Gospel":IMP3_GENREINDEX(39) = "Noise"
IMP3_GENREINDEX(40) = "Alternative Rock":IMP3_GENREINDEX(41) = "Bass":IMP3_GENREINDEX(42) = "Soul":IMP3_GENREINDEX(43) = "Punk":IMP3_GENREINDEX(44) = "Space":IMP3_GENREINDEX(45) = "Meditative":IMP3_GENREINDEX(46) = "Instrumental Pop":IMP3_GENREINDEX(47) = "Instrumental Rock":IMP3_GENREINDEX(48) = "Ethnic":IMP3_GENREINDEX(49) = "Gothic"
IMP3_GENREINDEX(50) = "Darkwave":IMP3_GENREINDEX(51) = "Techno-Industrial":IMP3_GENREINDEX(52) = "Electronic":IMP3_GENREINDEX(53) = "Pop-Folk":IMP3_GENREINDEX(54) = "Eurodance":IMP3_GENREINDEX(55) = "Dream":IMP3_GENREINDEX(56) = "Southern Rock":IMP3_GENREINDEX(57) = "Comedy":IMP3_GENREINDEX(58) = "Cult":IMP3_GENREINDEX(59) = "Gangsta"
IMP3_GENREINDEX(60) = "Top 40":IMP3_GENREINDEX(61) = "Christian Rap":IMP3_GENREINDEX(62) = "Pop/Funk":IMP3_GENREINDEX(63) = "Jungle":IMP3_GENREINDEX(64) = "Native American":IMP3_GENREINDEX(65) = "Cabaret":IMP3_GENREINDEX(66) = "New Wave":IMP3_GENREINDEX(67) = "Psychadelic":IMP3_GENREINDEX(68) = "Rave":IMP3_GENREINDEX(69) = "Showtunes"
IMP3_GENREINDEX(70) = "Trailer":IMP3_GENREINDEX(71) = "Lo-Fi":IMP3_GENREINDEX(72) = "Tribal":IMP3_GENREINDEX(73) = "Acid Punk":IMP3_GENREINDEX(74) = "Acid Jazz":IMP3_GENREINDEX(75) = "Polka":IMP3_GENREINDEX(76) = "Retro":IMP3_GENREINDEX(77) = "Musical":IMP3_GENREINDEX(78) = "Rock & Roll":IMP3_GENREINDEX(79) = "Hard Rock"
;Usage of IMP3_BITRATEINDEX:
; W=(X,Y,Z)
; W This is the Bitrate in Kilobytes/Second
; X This is Bitrate
; Y This is Layer
; Z This is 0(MPEG1) or 1(MPEG2 & MPEG2.5)
;Usage of IMP3_SAMPLINGRATEINDEX
; W=(X,Y)
; W This is Sampling rate frequency in Hz
; X This is Version
; Y This is Samplingrate
;Usage of IMP3_GENREINDEX:
; W=(X)
; W Genre Name
; X This is ID3v1\Genre

Type MP3Data
Field File$

Field MP3Header.MP3DHeader

Field ID3v1.MP3DID3v1
Field ID3v2.MP3DID3v2
End Type
Type MP3DHeader
Field PH.MP3DHeader
Field NH.MP3DHeader

Field Version
Field Layer
Field ErrorProtection, ErrorProtectionCRC16
Field Bitrate
Field Samplingrate
Field Padding, PaddingExtension
Field Mode, ModeExtension
Field Copyright, Original
Field Emphasis

Field FrameData
Field FrameSize
End Type
Type MP3DID3v1
Field Title$
Field Artist$
Field Album$
Field Year
Field Comment$
Field Track
Field Genre

Field ExtTitle$
Field ExtArtist$
Field ExtAlbum$
Field ExtSpeed
Field ExtGenre$
Field ExtStartTime$
Field ExtEndTime$
End Type
Type MP3DID3v2
Field MajorVersion, MinorVersion
Field Flags, Size

Field Sync
Field Compressed

Field FrameBank
Field Frames
End Type
Type MP3DID3v2Frame
Field ID$
Field Size
Field Bank
End Type

Function IMP3_ReadCString$(fsStream, MaxLength=256, MLRN=False)
Local OutString$ = ""
While (Not Eof(fsStream)) And (Len(OutString) < MaxLength)
Local Byte = ReadByte(fsStream)
If Byte = 0 Then Exit
OutString=OutString+Chr(Byte)
Wend
If Len(OutString) = MaxLength And MLRN=True Then Return ""
Return OutString
End Function

Global IMP3_LastError, IMP3_LastErrorDesc$
Function IdentifyMP3.MP3Data(File$)
Local fsStream, MP3D.MP3Data, ID32F.MP3DID3v2Frame, ID32P, iSize
If FileType(File) = 1
fsStream = ReadFile(File)
iSize = FileSize(File)
If fsStream <> 0
MP3D = New MP3Data
MP3D\File = File
IMP3_LastError = IMP3_ERROR_SUCCESS
IMP3_LastErrorDesc = "What error?"

Local ID3v2ID$ = IMP3_ReadCString(fsStream,3)
If ID3v2ID = "ID3"
MP3D\ID3v2 = New MP3DID3v2
MP3D\ID3v2\MajorVersion = ReadByte(fsStream)
MP3D\ID3v2\MinorVersion = ReadByte(fsStream)
MP3D\ID3v2\Flags = ReadByte(fsStream)
MP3D\ID3v2\Size = ReadInt(fsStream) And $0FFFFFFF
If (MP3D\ID3v2\MajorVersion = 2)
MP3D\ID3v2\Sync = MP3D\ID3v2\Flags Shr 31
MP3D\ID3v2\Compressed = MP3D\ID3v2\Flags Shl 1 Shr 31

MP3D\ID3v2\FrameBank = CreateBank(0)
MP3D\ID3v2\Frames = 0
While ID32P < MP3D\ID3v2\Size
MP3D\ID3v2\Frames = MP3D\ID3v2\Frames + 1
ResizeBank(MP3D\ID3v2\FrameBank, MP3D\ID3v2\Frames*4)

ID32F = New MP3DID3v2Frame
ID32F\ID = IMP3_ReadCString(fsStream,3)
ID32F\Size = (ReadByte(fsStream) Shl 16 + ReadByte(fsStream) Shl 8 + ReadByte(fsStream))
ID32F\Bank = CreateBank(ID32F\Size)
ReadBytes(ID32F\Bank,fsStream,0,ID32F\Size)
ID32P = 6+ID32F\Size

PokeInt MP3D\ID3v2\FrameBank, MP3D\ID3v2\Frames*4-4, Handle(ID32F)
Wend
Else
SeekFile fsStream,FilePos(fsStream)+MP3D\ID3v2\Size
IMP3_LastError = IMP3_ERROR_ID3V2VERSIONUNKNOWN
IMP3_LastErrorDesc = "ID3v2 Version "+MP3D\ID3v2\MajorVersion+"."+MP3D\ID3v2\MinorVersion+" is unknown."
Delete MP3D\ID3v2
EndIf
EndIf

;MP3Header(s)
Local iTemp0, CH.MP3DHeader, FH.MP3DHeader, iTempBitrate, iTempSamplingrate, iTempVersion
While Not (iSize-FilePos(fsStream) < 32)
iTemp0 = ReadInt(fsStream)
If iTemp0 And $FFE00000 = $FFE00000
If (CH = Null) Then
CH = New MP3DHeader
Else
CH\NH = New MP3DHeader
CH\NH\PH = CH
CH = CH\NH
EndIf
If (FH = Null) Then FH = CH

CH\Version = iTemp0 Shl 11 Shr 30
CH\Layer = iTemp0 Shl 13 Shr 30
CH\ErrorProtection = iTemp0 Shl 15 Shr 31
CH\Bitrate = iTemp0 Shl 16 Shr 28
CH\Samplingrate = iTemp0 Shl 20 Shr 30
CH\Padding = iTemp0 Shl 22 Shr 31
CH\PaddingExtension = iTemp0 Shl 23 Shr 31
CH\Mode = iTemp0 Shl 24 Shr 30
CH\ModeExtension = iTemp0 Shl 26 Shr 30
CH\Copyright = iTemp0 Shl 28 Shr 31
CH\Original = iTemp0 Shl 29 Shr 31
CH\Emphasis = iTemp0 Shl 30 Shr 30

If (CH\ErrorProtection = True) Then CH\ErrorProtectionCRC16 = ReadShort(fsStream)

iTempVersion = 1
If CH\Version = IMP3_HEADER_VERSION_MPEG1 Then iTempVersion = 0
iTempBitrate = IMP3_BITRATEINDEX(CH\Bitrate,CH\Layer,iTempVersion)
iTempSamplingrate = IMP3_SAMPLINGRATEINDEX(CH\Version,CH\Samplingrate)

If (CH\Version = IMP3_HEADER_VERSION_MPEG1) Then
If (CH\Layer = IMP3_HEADER_LAYER_LAYER1)
CH\FrameSize = (48000*iTempBitrate)/iTempSamplingrate + CH\Padding
Else
CH\FrameSize = (144000*iTempBitrate)/iTempSamplingrate + CH\Padding
EndIf
Else
If (CH\Layer = IMP3_HEADER_LAYER_LAYER1)
CH\FrameSize = (24000*iTempBitrate)/iTempSamplingrate + CH\Padding
Else
CH\FrameSize = (72000*iTempBitrate)/iTempSamplingrate + CH\Padding
EndIf
EndIf
CH\FrameData = CreateBank(CH\FrameSize)
ReadBytes(CH\FrameData,fsStream,0,CH\FrameSize)

;Check if TAG+ or TAG is there. Fuck you Winamp and your LYRICS Header. ID3v2 has that BUILT-IN!
Local sTemp$ = IMP3_ReadCString(fsStream,4)
If sTemp$ = "TAG+"
MP3D\ID3v1 = New MP3DID3v1
MP3D\ID3v1\ExtTitle = IMP3_ReadCString(fsStream,60)
MP3D\ID3v1\ExtArtist = IMP3_ReadCString(fsStream,60)
MP3D\ID3v1\ExtAlbum = IMP3_ReadCString(fsStream,60)
MP3D\ID3v1\ExtSpeed = ReadByte(fsStream)
MP3D\ID3v1\ExtGenre = IMP3_ReadCString(fsStream,30)
MP3D\ID3v1\ExtStartTime = IMP3_ReadCString(fsStream,6)
MP3D\ID3v1\ExtEndTime = IMP3_ReadCString(fsStream,6)
sTemp$ = IMP3_ReadCString(fsStream,3)
If sTemp$ = "TAG"
MP3D\ID3v1\Title = IMP3_ReadCString(fsStream,30)
MP3D\ID3v1\Artist = IMP3_ReadCString(fsStream,30)
MP3D\ID3v1\Album = IMP3_ReadCString(fsStream,30)
MP3D\ID3v1\Year = ReadInt(fsStream)
MP3D\ID3v1\Comment = IMP3_ReadCString(fsStream,30)
MP3D\ID3v1\Track = 0
If (Len(MP3D\ID3v1\Comment) = 28) Then
MP3D\ID3v1\Track = ReadByte(fsStream)
EndIf
MP3D\ID3v1\Genre = ReadByte(fsStream)
Else
DebugLog "ID3v1 not found at "+FilePos(fsStream)+"/"+iSize+"."
EndIf
Else
SeekFile fsStream,FilePos(fsStream)-4
sTemp$ = IMP3_ReadCString(fsStream,3)
If sTemp$ = "TAG"
MP3D\ID3v1 = New MP3DID3v1
MP3D\ID3v1\Title = IMP3_ReadCString(fsStream,30)
MP3D\ID3v1\Artist = IMP3_ReadCString(fsStream,30)
MP3D\ID3v1\Album = IMP3_ReadCString(fsStream,30)
MP3D\ID3v1\Year = ReadInt(fsStream)
MP3D\ID3v1\Comment = IMP3_ReadCString(fsStream,30)
MP3D\ID3v1\Track = 0
If (Len(MP3D\ID3v1\Comment) = 28) Then
MP3D\ID3v1\Track = ReadByte(fsStream)
EndIf
MP3D\ID3v1\Genre = ReadByte(fsStream)
Else
DebugLog "ID3v1 not found at "+FilePos(fsStream)+"/"+iSize+"."
EndIf
EndIf
EndIf
Wend
MP3D\MP3Header = FH

If (MP3D\ID3v1 = Null) ;We didn't find it yet? use usual position.
SeekFile fsStream,iSize-128-227
;Check if TAG+ or TAG is there.
sTemp$ = IMP3_ReadCString(fsStream,4)
If sTemp$ = "TAG+"
MP3D\ID3v1 = New MP3DID3v1
MP3D\ID3v1\ExtTitle = IMP3_ReadCString(fsStream,60)
MP3D\ID3v1\ExtArtist = IMP3_ReadCString(fsStream,60)
MP3D\ID3v1\ExtAlbum = IMP3_ReadCString(fsStream,60)
MP3D\ID3v1\ExtSpeed = ReadByte(fsStream)
MP3D\ID3v1\ExtGenre = IMP3_ReadCString(fsStream,30)
MP3D\ID3v1\ExtStartTime = IMP3_ReadCString(fsStream,6)
MP3D\ID3v1\ExtEndTime = IMP3_ReadCString(fsStream,6)
sTemp$ = IMP3_ReadCString(fsStream,3)
If sTemp$ = "TAG"
MP3D\ID3v1\Title = IMP3_ReadCString(fsStream,30)
MP3D\ID3v1\Artist = IMP3_ReadCString(fsStream,30)
MP3D\ID3v1\Album = IMP3_ReadCString(fsStream,30)
MP3D\ID3v1\Year = ReadInt(fsStream)
MP3D\ID3v1\Comment = IMP3_ReadCString(fsStream,30)
MP3D\ID3v1\Track = 0
If (Len(MP3D\ID3v1\Comment) = 28) Then
MP3D\ID3v1\Track = ReadByte(fsStream)
EndIf
MP3D\ID3v1\Genre = ReadByte(fsStream)
Else
DebugLog "ID3v1 not found at "+FilePos(fsStream)+"/"+iSize+"."
EndIf
Else
SeekFile fsStream,iSize-128
sTemp$ = IMP3_ReadCString(fsStream,3)
If sTemp$ = "TAG"
MP3D\ID3v1 = New MP3DID3v1
MP3D\ID3v1\Title = IMP3_ReadCString(fsStream,30)
MP3D\ID3v1\Artist = IMP3_ReadCString(fsStream,30)
MP3D\ID3v1\Album = IMP3_ReadCString(fsStream,30)
MP3D\ID3v1\Year = ReadInt(fsStream)
MP3D\ID3v1\Comment = IMP3_ReadCString(fsStream,30)
MP3D\ID3v1\Track = 0
If (Len(MP3D\ID3v1\Comment) = 28) Then
MP3D\ID3v1\Track = ReadByte(fsStream)
EndIf
MP3D\ID3v1\Genre = ReadByte(fsStream)
Else
DebugLog "ID3v1 not found at "+FilePos(fsStream)+"/"+iSize+"."
EndIf
EndIf
EndIf
CloseFile fsStream
Return MP3D
Else
IMP3_LastError = IMP3_ERROR_OPENSTREAMFAILED
IMP3_LastErrorDesc = "Could not open File '"+File+"' for reading. Is the File open for writing?"
Return Null
EndIf
Else
IMP3_LastError = IMP3_ERROR_FILEINVALID
IMP3_LastErrorDesc = "The File '"+File+"' is non-existant."
Return Null
EndIf
End Function
Function IMP3_GetID3v2Frame$(MP3D.MP3Data,ID$)
If MP3D <> Null And MP3D\ID3v2 <> Null
For I = 0 To MP3D\ID3v2\Frames-1
Local MP3DF.MP3DID3v2Frame = Object.MP3DID3v2Frame(PeekInt(MP3D\ID3v2\FrameBank,I*4))
Local Txt$ = ""
If (ID = MP3DF\ID)
For I2 = 1 To MP3DF\Size-1
Txt = Txt + Chr(PeekByte(MP3DF\Bank,I2))
Next
Return Txt
EndIf
Next
Else
Return ""
EndIf
End Function


So, kein Beispiel vorhanden. Die Type ist eigentlich selbserklärend genug.

Edit: Ein paar fixes und eine Funktion hinzugefügt die einem die ID3v2 Frame Daten holte. Smile
Edit: Noch ein fix, sollte nun bei einer nicht-unterstützten ID3v2 version keinen ID3v2 Typeeintrag mehr anlegen.
Edit: Und noch einer! LAME kodierte MP3s sollten nun richtig erkannt werden bzw. deren ID3v1 TAG.
  • Zuletzt bearbeitet von Xaymar am Fr, Okt 19, 2012 14:15, insgesamt 6-mal bearbeitet

FireballFlame

BeitragDo, Feb 03, 2011 20:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm, warum benutzt du dafür massenhaft Globals? Ich fände ein Type besser geeignet.
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

Xaymar

ehemals "Cgamer"

BeitragDo, Feb 03, 2011 20:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Angewohneit aus C++ . Und die Type wäre auch nicht kleiner Wink .
Warbseite

FireballFlame

BeitragDo, Feb 03, 2011 21:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Wäre aber übersichtlicher, ließe sich mit weniger Schreibarbeit benutzen, und man könnte mehrere Tag-Sammlungen gleichzeitig speichern, statt dass die globalen Variablen jedesmal überschrieben werden. Wink

Xaymar hat Folgendes geschrieben:
Angewohneit aus C++ .
...du programmierst in C++ un-objektorientierter als es in BlitzBasic möglich wär? :O
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

Xaymar

ehemals "Cgamer"

BeitragDo, Feb 03, 2011 21:34
Antworten mit Zitat
Benutzer-Profile anzeigen
manchmal. Je nachdem was die Situation zulässt. Das ist zum Beispiel nun ein Teil aus XaymarHelper.dll .
Code: [AUSKLAPPEN]
#include <windows.h>

#define DLL_EXPORT extern "C" _declspec(dllexport)
#define DLL_IMPORT extern "C" _declspec(dllimport)
#define DLL_CALL _stdcall

WNDPROC gBlitzProc;
HWND gBlitzWindow;
int iClose;
int MainMonitorX, MainMonitorY;
int MainMonitorW, MainMonitorH;

DLL_EXPORT int DLL_CALL InstallCloseHandler(char *BlitzWindowName);
DLL_EXPORT int DLL_CALL GetWindowClose();
DLL_EXPORT int DLL_CALL UnInstallCloseHandler();
DLL_EXPORT void DLL_CALL GetMainMonitorSize(int Bank);
DLL_EXPORT void DLL_CALL CursorBounds(int X, int Y, int W, int H);

BOOL APIENTRY DllMain( HANDLE hModule, DWORD  fdwReason, LPVOID lpReserved ) {
    return TRUE;
}

DLL_EXPORT int DLL_CALL GetWindowClose() {
    int RetVal;RetVal = iClose;
    iClose = iClose-1;
    if (iClose < 0) iClose = 0;
    return RetVal;
}
DLL_EXPORT int DLL_CALL InstallCloseHandler(char *BlitzWindowName) {
    gBlitzWindow = FindWindow("Blitz Runtime Class", BlitzWindowName);
    if(!gBlitzWindow) return false;
    gBlitzProc = (WNDPROC)SetWindowLong(gBlitzWindow, GWL_WNDPROC, (LONG)WindowProc);
    return true;
}

Und das ein Teil aus BlitzNewton:
Code: [AUSKLAPPEN]
class BlitzNewtonBody {
   public:
      BlitzNewtonBody(BlitzNewtonWorld* BNWorld, BlitzNewtonCollision* BNCollision) {}
      ~BlitzNewtonBody() {}
      
      void SetGravityAffection(bool bState) {}
      bool GetGravityAffection() {}
      
      void SetVelocity(float fX, float fY, float fZ) {}
      void GetVelocity(float* fVelo) {}
      
      void SetForce(float fX, float fY, float fZ) {}
      void GetForce(float* fForc) {}
      void SetAddForce(float fX, float fY, float fZ) {}
      void AddForce(float fX, float fY, float fZ) {}
      void GetAddForce(float* fForc) {}
      
      void SetTorque(float fX, float fY, float fZ) {}
      void GetTorque(float* fTorq) {}
      void SetAddTorque(float fX, float fY, float fZ) {}
      void AddTorque(float fX, float fY, float fZ) {}
      void GetAddTorque(float* fTorq) {}
      
      void SetMassMatrix(float fMass, float fiX, float fiY, float fiZ) {}
      
      void GetRotationN(float* fRot) {}
      
      void SetFrozen(bool bFrozen) {}
      bool GetFrozen() {}
      
      void OverridePosition() {}
      void OverrideRotation() {}
      
      void SetMaterialGroupID(int iMaterial) {}
      
      BlitzNewtonMatrix* GetMatrix() {}
      void SetMatrix(BlitzNewtonMatrix* BNMatrix) {}
      
      BlitzNewtonWorld* World() {}
      BlitzNewtonCollision* Collision() {}
      NewtonBody* Body() {}      
   private:
      BlitzNewtonWorld*      blitzWorld;
      BlitzNewtonCollision*   blitzCollision;
      BlitzNewtonMatrix*      blitzMatrix;
      NewtonBody*            newtonBody;
      
      bool               bAutoDeleteMatrix;
      bool               bGravity;
      
      float*               fForce;
      float*               fTorque;
};

Und da BlitzBASIC nun mal nicht OOP kann(, außer man nimmt extra Parser,) nehme ich Globals. Blitz kann zwar Type/LinkedList basiert(OOP ist afaik was anderes, da muss man die Dinge selbst verwalten Wink ).

Punkt 1: "Wäre aber übersichtlicher, ließe sich mit weniger Schreibarbeit benutzen"
Hmm, selbe Schreibarbeit, gleich übersichtlich. Kommt wohl auf den Betrachter an. Hätte natürlich auch mit meiner ersten Idee hier auftauchen können(Banks) aber da wurde es mir nach der Zeit zu bunt.
Punkt 2: "man könnte mehrere Tag-Sammlungen gleichzeitig speichern"
Kann man auch jetzt noch. einfach mal das selber machen, was sonst andere für euch übernehmen. Dazu ist es ja gedacht.

Ich fokussiere mich jetzt mal wieder auf ID3v2.

Wall-of-Text Closed. End of File. ReadAvail = -1
Warbseite

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Feb 03, 2011 21:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Die meisten Menschen benutzen ID2V2 zum Speichern weiterer Informationen. Daher wäre es ratsam zumindest dieses Format noch mit zu unterstützen und dein Skript immer die beste Lösung wählt.

Kannst dir ja auch folgenden Link ansehen. Da hab ich das auch gemacht. Die Funktion liest mp3: ID2V1 und ID2V2, ogg -Tag und Tracknamen aus Trackermodulen wie it, xm, mod, s3m, mtm.

Auch wenn die Trackermodule unwichtig sind, sollte mp3 komplett unterstützt werden.

Ansonsten bin ich gespannt was noch daraus wird. Ein Gräul finde ich jedoch deine beiden Arrays. Das geht bestimmt auch besser und kürzer.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Xaymar

ehemals "Cgamer"

BeitragDo, Feb 03, 2011 21:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm das mit den Arrays geht zwar kürzer, aber besser (in Geschwindigkeit) gehts kaum, bzw fällt mir keine schnellere methode ein, außer Banks. Besser (in Platz/RAM verbauch) gehts auch noch mit Bank und Kompression, aber ich möchte mal bei geschwindigkeit bleiben).

Hmm und Mist das das schon jemand vor mir gemacht hat :/ . Aber so bin ich wenigstens an http://www.id3.org/id3v2-00 . (Kann deins die Bilder auslesen?)
Warbseite

FireballFlame

BeitragFr, Feb 04, 2011 17:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Xaymar hat Folgendes geschrieben:
Punkt 2: "man könnte mehrere Tag-Sammlungen gleichzeitig speichern"
Kann man auch jetzt noch. einfach mal das selber machen, was sonst andere für euch übernehmen. Dazu ist es ja gedacht.

Öh, nun ja.

Daten von 2 MP3s gleichzeitig benutzen, mit deinen Globals: BlitzBasic: [AUSKLAPPEN]
IdentifyMP3(File1)

Local IMP3_Sync_File1, IMP3_Version_File1, IMP3_Layer_File1, IMP3_Protected_File1, IMP3_Protected_CRC16_File1, IMP3_Bitrate_File1, IMP3_Samplingrate_File1, IMP3_Padding_File1, IMP3_PaddingExtension_File1, IMP3_Mode_File1, IMP3_ModeExtension_File1, IMP3_Copyright_File1, IMP3_Original_File1, IMP3_Emphasis
Local IMP3_ID3v1_Avaible_File1, IMP3_ID3v1_Title_File1$, IMP3_ID3v1_Artist_File1$, IMP3_ID3v1_Album_File1$, IMP3_ID3v1_Year_File1, IMP3_ID3v1_Comment_File1$, IMP3_ID3v1_Track_File1, IMP3_ID3v1_Genre
Local IMP3_ID3v1_ExtendedAvaible_File1, IMP3_ID3v1_ExtendedTitle_File1$, IMP3_ID3v1_ExtendedArtist_File1$, IMP3_ID3v1_ExtendedAlbum_File1$, IMP3_ID3v1_ExtendedSpeed_File1, IMP3_ID3v1_ExtendedGenre_File1$, IMP3_ID3v1_ExtendedStartTime_File1, IMP3_ID3v1_ExtendedEndTime

IMP3_Sync_File1 = IMP3_Sync
IMP3_Version_File1 = IMP3_Version
IMP3_Layer_File1 = IMP3_Layer
IMP3_Protected_File1 = IMP3_Protected
IMP3_Protected_CRC16_File1 = IMP3_Protected_CRC16
IMP3_Bitrate_File1 = IMP3_Bitrate
IMP3_Samplingrate_File1 = IMP3_Samplingrate
IMP3_Padding_File1 = IMP3_Padding
IMP3_PaddingExtension_File1 = IMP3_PaddingExtension
IMP3_Mode_File1 = IMP3_Mode
IMP3_ModeExtension_File1 = IMP3_ModeExtension
IMP3_Copyright_File1 = IMP3_Copyright
IMP3_Original_File1 = IMP3_Original
IMP3_Emphasis_File1 = IMP3_Emphasis
IMP3_ID3v1_Avaible_File1 = IMP3_ID3v1_Avaible
IMP3_ID3v1_Title_File1 = IMP3_ID3v1_Title
IMP3_ID3v1_Artist_File1 = IMP3_ID3v1_Artist
IMP3_ID3v1_Album_File1 = IMP3_ID3v1_Album
IMP3_ID3v1_Year_File1 = IMP3_ID3v1_Year
IMP3_ID3v1_Comment_File1 = IMP3_ID3v1_Comment
IMP3_ID3v1_Track_File1 = IMP3_ID3v1_Track
IMP3_ID3v1_Genre_File1 = IMP3_ID3v1_Genre
IMP3_ID3v1_ExtendedAvaible_File1 = IMP3_ID3v1_ExtendedAvaible
IMP3_ID3v1_ExtendedTitle_File1 = IMP3_ID3v1_ExtendedTitle
IMP3_ID3v1_ExtendedArtist_File1 = IMP3_ID3v1_ExtendedArtist
IMP3_ID3v1_ExtendedAlbum_File1 = IMP3_ID3v1_ExtendedAlbum
IMP3_ID3v1_ExtendedSpeed_File1 = IMP3_ID3v1_ExtendedSpeed
IMP3_ID3v1_ExtendedGenre_File1 = IMP3_ID3v1_ExtendedGenre
IMP3_ID3v1_ExtendedStartTime_File1 = IMP3_ID3v1_ExtendedStartTime
IMP3_ID3v1_ExtendedEndTime_File1 = IMP3_ID3v1_ExtendedEndTime

IdentifyMP3(File2)
Daten von 2 MP3s gleichzeitig benutzen, "objektorientiert": BlitzBasic: [AUSKLAPPEN]
Local Data1.MP3Data = IdentifyMP3(File1)
Local Data2.MP3Data = IdentifyMP3(File2)

Hier wird dann auch der Punkt 1 mit der Übersichtlichkeit und Schreibarbeit deutlich.
Bist du sicher, dass dir da kein Unterschied in der Benutzbarkeit auffällt? Wink
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

Xaymar

ehemals "Cgamer"

BeitragSa, Feb 05, 2011 0:30
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
Type MP3Data
Field File$

;MP3 Header(s)
Field Sync
Field Version
Field Layer
;Field ...

;ID3v1 Data
Field Artist$, Title$
Field Album$
;Field ...
End Type

Function GetMP3Data.MP3Data(File$)
Select IdentifyMP3(File)
Case IMP3_ERROR_SUCCESS
Local MP3.MP3Data = New MP3Data
MP3\File = File

MP3\Sync = IMP3_Sync
MP3\Version = IMP3_Version
MP3\Layer = IMP3_Layer

If IMP3_ID3v1_ExtendedAvaible = True
MP3\Title = IMP3_ID3v1_ExtendedTitle
MP3\Artist = IMP3_ID3v1_ExtendedArtist
MP3\Album = IMP3_ID3v1_ExtendedAlbum
Else
If IMP3_ID3v1_Avaible = True
MP3\Title = IMP3_ID3v1_Title
MP3\Artist = IMP3_ID3v1_Artist
MP3\Album = IMP3_ID3v1_Album
EndIf
EndIf
Default
Return Null
End Select
End Function

>_>
Wo zur Hölle ist dein Problem, FF?
Warbseite

FireballFlame

BeitragSa, Feb 05, 2011 2:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe kein Problem, ich hab eigentlich nur einen Vorschlag gemacht.
Ich geb die Frage mal zurück, was soll die Fettschrift?
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

Xaymar

ehemals "Cgamer"

BeitragSa, Feb 05, 2011 16:53
Antworten mit Zitat
Benutzer-Profile anzeigen
http://www.id3.org/id3v2-00 wird nun unterstützt, bald kommt noch http://www.id3.org/id3v2.3.0 und http://www.id3.org/id3v2.4.0-structure hinzu. Zusätzlich dazu bin ich nun vom Prototyp auf RC gewechselt.
Viel Spaß mit den neuen Möglichkeiten.

@FF: Die Fettschrift heißt das du anfängst mir auf den Geist zu gehen.
Warbseite

BladeRunner

Moderator

BeitragSa, Feb 05, 2011 19:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Wir bleiben hier alle freundlich und nett oder Onkel Blade wird auch mal böse.
Xaymar: Er gibt dir Feedback, was geht Dir daran so auf den Senkel?
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Xaymar

ehemals "Cgamer"

BeitragSa, Feb 05, 2011 19:44
Antworten mit Zitat
Benutzer-Profile anzeigen
FireballFlame hat Folgendes geschrieben:
Daten von 2 MP3s gleichzeitig benutzen, mit deinen Globals: BlitzBasic: [AUSKLAPPEN]
IdentifyMP3(File1)

Local IMP3_Sync_File1, IMP3_Version_File1, IMP3_Layer_File1, IMP3_Protected_File1, IMP3_Protected_CRC16_File1, IMP3_Bitrate_File1, IMP3_Samplingrate_File1, IMP3_Padding_File1, IMP3_PaddingExtension_File1, IMP3_Mode_File1, IMP3_ModeExtension_File1, IMP3_Copyright_File1, IMP3_Original_File1, IMP3_Emphasis
Local IMP3_ID3v1_Avaible_File1, IMP3_ID3v1_Title_File1$, IMP3_ID3v1_Artist_File1$, IMP3_ID3v1_Album_File1$, IMP3_ID3v1_Year_File1, IMP3_ID3v1_Comment_File1$, IMP3_ID3v1_Track_File1, IMP3_ID3v1_Genre
Local IMP3_ID3v1_ExtendedAvaible_File1, IMP3_ID3v1_ExtendedTitle_File1$, IMP3_ID3v1_ExtendedArtist_File1$, IMP3_ID3v1_ExtendedAlbum_File1$, IMP3_ID3v1_ExtendedSpeed_File1, IMP3_ID3v1_ExtendedGenre_File1$, IMP3_ID3v1_ExtendedStartTime_File1, IMP3_ID3v1_ExtendedEndTime

IMP3_Sync_File1 = IMP3_Sync
IMP3_Version_File1 = IMP3_Version
IMP3_Layer_File1 = IMP3_Layer
IMP3_Protected_File1 = IMP3_Protected
IMP3_Protected_CRC16_File1 = IMP3_Protected_CRC16
IMP3_Bitrate_File1 = IMP3_Bitrate
IMP3_Samplingrate_File1 = IMP3_Samplingrate
IMP3_Padding_File1 = IMP3_Padding
IMP3_PaddingExtension_File1 = IMP3_PaddingExtension
IMP3_Mode_File1 = IMP3_Mode
IMP3_ModeExtension_File1 = IMP3_ModeExtension
IMP3_Copyright_File1 = IMP3_Copyright
IMP3_Original_File1 = IMP3_Original
IMP3_Emphasis_File1 = IMP3_Emphasis
IMP3_ID3v1_Avaible_File1 = IMP3_ID3v1_Avaible
IMP3_ID3v1_Title_File1 = IMP3_ID3v1_Title
IMP3_ID3v1_Artist_File1 = IMP3_ID3v1_Artist
IMP3_ID3v1_Album_File1 = IMP3_ID3v1_Album
IMP3_ID3v1_Year_File1 = IMP3_ID3v1_Year
IMP3_ID3v1_Comment_File1 = IMP3_ID3v1_Comment
IMP3_ID3v1_Track_File1 = IMP3_ID3v1_Track
IMP3_ID3v1_Genre_File1 = IMP3_ID3v1_Genre
IMP3_ID3v1_ExtendedAvaible_File1 = IMP3_ID3v1_ExtendedAvaible
IMP3_ID3v1_ExtendedTitle_File1 = IMP3_ID3v1_ExtendedTitle
IMP3_ID3v1_ExtendedArtist_File1 = IMP3_ID3v1_ExtendedArtist
IMP3_ID3v1_ExtendedAlbum_File1 = IMP3_ID3v1_ExtendedAlbum
IMP3_ID3v1_ExtendedSpeed_File1 = IMP3_ID3v1_ExtendedSpeed
IMP3_ID3v1_ExtendedGenre_File1 = IMP3_ID3v1_ExtendedGenre
IMP3_ID3v1_ExtendedStartTime_File1 = IMP3_ID3v1_ExtendedStartTime
IMP3_ID3v1_ExtendedEndTime_File1 = IMP3_ID3v1_ExtendedEndTime

IdentifyMP3(File2)

Das. Die Behauptung das man das so benutzen muss "wenn man meine globals nutzt".
Warbseite

BladeRunner

Moderator

BeitragSa, Feb 05, 2011 19:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Meinst Du nicht dass es Sinn und Zweck einer Diskussion in einem Forum ist sich auszutauschen?
Ich kann seitens FBF keinerlei beleidigendes oder angreifendes Verhalten sehen. Von Dir durchaus. Niemand sagt dass einer von euch komplett recht hat und der andere Scheissdreck redet. Aber man kann doch voneinander lernen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Thorsten

BeitragMi, Sep 07, 2011 22:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, wäre es möglich auch noch eine setzen-Funktion zu machen statt nur auszulesen?

mfG,

Thorsten

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group