Seite 1 von 2

64 Bit Variablen

Verfasst: 12.03.2005 05:33
von normen
Ich moechte die Laenge einer Mediadatei mittels IMediaSeeking\GetDuration(@LongLong) ermitteln, aber leider werden ja 64 Bit Variablen (longlong) noch nicht unterstuetzt. Weiss vielleicht jemand einen Weg, dieses Problem zu umgehen?

Verfasst: 12.03.2005 14:17
von Laurin
Auf www.purearea.net gibt es eine UserLib, mit der man 64Bit-Variablen benutzen kann. Sie heißt UInt64.

Greetz Laurin

Verfasst: 12.03.2005 15:30
von jear
@Normen

GPI's jaPBe bringt in seinem Include-Ordner auch die LongLongs-Routinen mit. Die bieten eine ziemlich vollständige Sammlung von Prozeduren für die Nutzung von 64Bit-Integers mit.

Ich versuche z.Zt. auch, in die DX9-Features zum Abspielen von Videos einzusteigen, suche allerdings noch den Anfang des Fadens, wie man unter Nutzung der in 3.9.3 neu enthaltenen Interfaces auf die DX9-Funktionen zugreifen kann.

Hast Du da einen Tip oder ein Code-Beispiel für mich?

Verfasst: 12.03.2005 15:31
von Froggerprogger
Liefert GetDuration(@LongLong) denn Millisekunden ?
Dann genügt dir vielleicht der 'untere' Long-Wert, immerhin kann der (trotz signed) etwa 2Mrd Millisekunden darstellen, also etwa 248 Tage.

Dann könntest Du zum reinen Auslesen auch sowas nutzen.

Code: Alles auswählen

Structure myLONGLONG
  hi.l
  lo.l
EndStructure

*d.myLONGLONG = IMediaSeeking\GetDuration(@LongLong)

Debug Str(*d\lo) + " ms duration"

Verfasst: 12.03.2005 21:58
von normen
Die GetDuration(@LongLong) liefert die Zeit in 100ns (nano...), und das ist ein verdammt kleiner Wert. Ich hatte das ja schon alles programmiert und erst 'ne Woche spaeter bin ich ueber das Problem gestolpert. Ich habe GetDuration(@LongLong) und GetCurrentPosition(@LongLong) benutzt, um die Laenge und aktuelle Position zu bestimmen. Als ich das erste mal eine MP3 abgespielt hatte, die laenger als ein paar Minuten war, wurde das alles ziemlich komisch. Ich glaube, mit 32 bit kann man so etwa 7 Minuten darstellen.

Verfasst: 12.03.2005 22:02
von Froggerprogger
Jau! Mit signed sogar nur 3,57 Minuten.
(2^31 / 10 (=microsecs) / 1000 (=millisecs) / 1000 (=secs) / 60 (=minuten))

Dann führt der Weg wohl zu den Libraries. :wink:

Verfasst: 13.03.2005 02:50
von normen
Also, ich bin jetzt kurtz vorm Aufgeben. Ich schaetze mal, dass ich meinen Mediaplayer ohne Spieldauerangaben lassen muss.
Ich schaffe es einfach nicht, den Wert mittels einem der vorgeschlagenen Wege zu verarbeiten.
Wenn ich eine
Structure myLONGLONG
hi.l
lo.l
EndStructure
definiere, dann wird nur eine 32 Bit Zahl an entweder den lo oder den hi Wert uebergeben, und das wars.
Die Routinen in den genannten Includes / Libraries funktionieren auch nicht, da ich die 64 Bit Zahl nich uebergeben kann, ohne eine "echte" Variable zu benutzen.

Code: Alles auswählen

IMediaSeeking\GetDuration(@LongLong) ; wobei LongLong den zu ermittelnden Wert erhaelt
>_<

Kann man vielleicht irgendwie die Funtion GetDuration() so veraendern, dass sie nicht einen Fehlercode zurueck gibt, sondern die zu ermittelnde Zeit? Das koennte naemlich funktionieren, da man sie dann in eine der 64 Bit Funktionen der Libraries einbinden koennte. Es muesste sowas wie eine C# Wrapper Funktion sein. Natuerlich habe ich keine Ahnung wie man sowas macht. :cry:

EDIT: Das gleiche muesste man dann natuerlich mit all den anderen IMediaSeeking Funtionen (GetCurrentPosition(), SetCurrentPosition(), etc.) machen, damit volle Funktionalitaet gegeben ist.

Verfasst: 13.03.2005 03:42
von normen
jear hat geschrieben:@Normen

GPI's jaPBe bringt in seinem Include-Ordner auch die LongLongs-Routinen mit. Die bieten eine ziemlich vollständige Sammlung von Prozeduren für die Nutzung von 64Bit-Integers mit.

Ich versuche z.Zt. auch, in die DX9-Features zum Abspielen von Videos einzusteigen, suche allerdings noch den Anfang des Fadens, wie man unter Nutzung der in 3.9.3 neu enthaltenen Interfaces auf die DX9-Funktionen zugreifen kann.

Hast Du da einen Tip oder ein Code-Beispiel für mich?
jear,

Dieser Forumbeitrag hat mir den Einstieg in diese Materie erleichtert. Ich arebeite noch mit der Verion 3.92, daher kann ich nichts ueber die neuen Interfaces sagen. Muss wohl doch endlich mal updaten... :oops:
http://forums.purebasic.com/german/view ... urcefilter

Verfasst: 13.03.2005 13:46
von Froggerprogger
Achso!
IMediaSeeking\GetDuration(@LongLong)
schreibt den Wert an die Stelle @LongLong und gibt nur einen Fehlercode zurück ?
Wußte ich nicht.
Klappt denn folgendes ebenfalls nicht ?

Code: Alles auswählen

Structure myLONGLONG
  hi.l
  lo.l
EndStructure

time.myLONGLONG

errorcode.l = IMediaSeeking\GetDuration(@time)

Debug Str(time\hi) + " * 2^32  * 100ns duration PLUS" 
Debug Str(time\lo) + " * 100ns duration" 
Wenn nein, hast Du einen kleinen Codeschnipsel, der einfach nur eine Datei öffnet und die Länge ermittelt ?

Verfasst: 13.03.2005 14:40
von jear
@Normen
Bei jaPBe ist auch eine Include-Datei dabei, über die man das MCI - Interface nutzen kann.
Das darin enthaltene Beispiel ist ein MP3-Player mit allen wichtigen Features.