Seite 1 von 1
IMediaSeeking\SetRate()
Verfasst: 23.03.2005 03:01
von normen
Ich versuche gerade, eine Suchfunktion in meinen Mediaplayer einzubauen, und bin dabei (mal wieder) ueber ein Problem gestolpert.
Die Funktion IMediaSeeking\SetRate() hat nach MSDN Angaben einen einzigen Parameter:
Versuche ich jedoch, diese Funktion in PB aufzurufen
Code: Alles auswählen
260 CoCreateInstance_(?CLSID_FilterGraph, #Null,#CLSCTX_INPROC_SERVER,?IID_IGraphBuilder,@lpGB.IGraphBuilder)
261 lpGB\QueryInterface(?IID_IMediaSeeking,@lpMS.IMediaSeeking)
...
300 speed.f
301 speed = 2
302 test.qfloat
303 Q_Float(test, speed)
304 lpMS\SetRate(test)
305 ...
, dann bruellt mich der Compiler so an:
Line 304 - Syntax Error !
Zum Spass habe ich mal einen zweiten Parameter hinzugefuegt.
Dann hat sich der Compiler nicht mehr beschwert, die Funktion hat natuerlich auch nichts gemacht.
Hat irgendjemand eine Ahnung, was da vor sich geht?
Re: IMediaSeeking\SetRate()
Verfasst: 23.03.2005 11:22
von traumatic
Das Interface ist aufgrund des in PB fehlenden Double-Typs als
SetRate(a_high.l,a_low.l) definiert.
Vielleicht hilft Dir die
F64 Library von Freedimension weiter.
Verfasst: 25.03.2005 17:20
von normen
Traumatic,
Hast Du das schon mal probiert und hat es funktioniert? Ich krieg das naemlich nicht gebacken.
Verfasst: 26.03.2005 02:48
von traumatic
Was geht denn nicht?
Hab's gerade mal ausprobiert:
Code: Alles auswählen
F64_Float(rate.double, 2.0)
pMS\SetRate(rate\a, rate\b)
Funktioniert, der Sound wird in doppelter Geschwindigkeit abgespielt.
Verfasst: 26.03.2005 02:58
von freedimension
Die F64 wird übrigens von jack aus'm englischen Forum weitergeführt. Ich bin und bleibe nur der Initiator

Verfasst: 26.03.2005 03:01
von traumatic
freedimension hat geschrieben:Die F64 wird übrigens von jack aus'm englischen Forum weitergeführt. Ich bin und bleibe nur der Initiator

Oh, das habe ich nicht einmal mit Hilfe des Helpfiles begriffen

Verfasst: 26.03.2005 23:51
von normen
traumatic hat geschrieben:Was geht denn nicht?
Hab's gerade mal ausprobiert:
Code: Alles auswählen
F64_Float(rate.double, 2.0)
pMS\SetRate(rate\a, rate\b)
Funktioniert, der Sound wird in doppelter Geschwindigkeit abgespielt.
Funktioniert bei mir nicht richtig. SetRate() gibt zwar "0" zurueck, und die Werte von rate scheinen auch zu stimmen, aber an der Geschwindigkeit des Sounds aendert sich gar nichts.
(10 Minuten spaeter...) Gerade habe ich mal noch ein wenig mit den Werten von rate gespielt, und es sieht so aus als ob ich den Sound zwar langsamer machen kann (0 < rate < 1), sobald ich aber rate > 1 habe, aendert sich nichts mehr. Mit rate = 2 komischerweise, gibt GetCurrentPosition() die doppelte "Geschwindigkeit" aus, aber es klingt alles ganz normal. In diesen Faellen lierfert GetRate() die richtigen Werte.
Mit rate > 2 und rate < 0 bekomme ich einen Fehler von SetRate().
Koennte das villeicht an etwas anderem liegen, vielleicht dem Sound Device oder dem Renderer?
Verfasst: 27.03.2005 01:32
von traumatic
Hi normen,
dazu kann ich Dir leider nichts sagen.
Mehr als 2.0 funktioniert bei mir ebenfalls nicht, in diesem Fall ist der
Rückgabewert allerdings auch (so wie's sein soll) != #S_OK.
Sicherlich ist das Ergebnis auch von den verwendenten Renderern
und Filtern abhängig (s. SDK docs) - genaueres weiß ich aber wie
gesagt auch nicht.
Ich könnte mir vorstellen, dass der CoDec zwar meldet, dass die
Funktionalität gegeben ist, sie aber trotzdem nicht unterstützt wird.
Das ist natürlich bloß reine Vermutung, für eine definitive Fehler-
erfassung fehlt mir schlicht die Erfahrung im Umgang mit Direct-
Show, habe ich doch bislang, abgesehen von den Forumsbeiträgen -
ausschließlich mit DirectSound gearbeitet.
Sorry...
EDIT: Hab gerade mal ein wenig in den einschlägigen Newsgroups
gestöbert, das Problem scheint zumindest nicht ganz unbekannt zu
sein...
EDIT2: '2.0' als Maximalwert wird von vielen bestätigt.
Verfasst: 31.03.2005 16:15
von traumatic
Normen, ich mach mir Sorgen um Dich!
Bist Du noch dran?
Verfasst: 31.03.2005 19:09
von normen
traumatic hat geschrieben:Normen, ich mach mir Sorgen um Dich!
Bist Du noch dran?

Das ist so lieb von Dir.
Ja, ich bin noch dran, habe nur im Moment ein paar Probleme mit meinen Schwiegereltern, und daher muss das Programmieren ein wenig in den Hintergrund treten.
Nichtsdestotrotz habe ich mir mal ein paar Gedanken um das o.g. Problem gemacht und sobald ich wieder ein wenig Zeit habe, werde ich versuchen, eine Art SetRate() mittels SetCurrentPosition() zu emulieren. Mal sehen ob das was wird. Wenn das funktioniert, dann sollte es kein Problem sein, unabhaengig vom verwendeten Renderer, Abspielraten von z.B. -300 bis +300 zu benutzen, zwar ohne Audio, aber wen kuemmert das schon.
Ich lass es Dich wissen.