IMediaSeeking\SetRate()

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
normen
Beiträge: 18
Registriert: 03.03.2005 17:47
Wohnort: Oakland, Kalifornien

IMediaSeeking\SetRate()

Beitrag 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:

Code: Alles auswählen

HRESULT SetRate(
  double dRate
);
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.

Code: Alles auswählen

lpMS\SetRate(test,0)
Dann hat sich der Compiler nicht mehr beschwert, die Funktion hat natuerlich auch nichts gemacht.
Hat irgendjemand eine Ahnung, was da vor sich geht?
The manual said 'Windows XP or better' ... so I used Linux.
traumatic
Beiträge: 478
Registriert: 27.11.2004 15:42

Re: IMediaSeeking\SetRate()

Beitrag 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.
normen
Beiträge: 18
Registriert: 03.03.2005 17:47
Wohnort: Oakland, Kalifornien

Beitrag von normen »

Traumatic,

Hast Du das schon mal probiert und hat es funktioniert? Ich krieg das naemlich nicht gebacken.
The manual said 'Windows XP or better' ... so I used Linux.
traumatic
Beiträge: 478
Registriert: 27.11.2004 15:42

Beitrag 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.
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag von freedimension »

Die F64 wird übrigens von jack aus'm englischen Forum weitergeführt. Ich bin und bleibe nur der Initiator :oops:
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
traumatic
Beiträge: 478
Registriert: 27.11.2004 15:42

Beitrag von traumatic »

freedimension hat geschrieben:Die F64 wird übrigens von jack aus'm englischen Forum weitergeführt. Ich bin und bleibe nur der Initiator :oops:
Oh, das habe ich nicht einmal mit Hilfe des Helpfiles begriffen ;)
normen
Beiträge: 18
Registriert: 03.03.2005 17:47
Wohnort: Oakland, Kalifornien

Beitrag 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?
The manual said 'Windows XP or better' ... so I used Linux.
traumatic
Beiträge: 478
Registriert: 27.11.2004 15:42

Beitrag 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.
traumatic
Beiträge: 478
Registriert: 27.11.2004 15:42

Beitrag von traumatic »

Normen, ich mach mir Sorgen um Dich! <)
Bist Du noch dran?
normen
Beiträge: 18
Registriert: 03.03.2005 17:47
Wohnort: Oakland, Kalifornien

Beitrag von normen »

traumatic hat geschrieben:Normen, ich mach mir Sorgen um Dich! <)
Bist Du noch dran?
:oops: 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.
The manual said 'Windows XP or better' ... so I used Linux.
Antworten