Include file for native Directshow support in PB4

Developed or developing a new product in PureBasic? Tell the world about it.
inc.
Enthusiast
Enthusiast
Posts: 406
Joined: Thu May 06, 2004 4:28 pm
Location: Cologne/GER

Include file for native Directshow support in PB4

Post by inc. »

Hi,

it has often been discussed that PBs internal Movie Library doesn't handle some formats properly or even does provide wrong time lenghts which also messes up proper seeking. Such issues on mp3 handling for instance where more or less solved by using MCI. This also can be replaced by using this include file.

I did generate an include file incl. commands which in certain situations can replace PBs movie commands . For avoiding confusions I did define those Commands as "Media" Commands as Directshow also is able to perfectly playback & handle audio formats.
The supported formats do depend on the users system installed Dshow filters, means splitters, filters, decoders etc.

I also appended an example where you simply can see the usage.
Beside handling/decoding media formats its also capable to render media outputs individually. Means you/the user can decide which one has to be used for rendering like ... DefaultRenderer, Overlaymixer, VMR7_Windowed/Windowless, VMR9_Windowed/Windowless. And in case of Audio for example the Direct Sound Renderer or the Waveout Renderer.
Such capabilities are i.E. known from MediaplayerClassic and other Dshow supporting Media-Playback apps.

Also you can enumerate the filters in the graph which are actually used for playback ;)

I testet the include using many formats and their containers under WinXP SP2 und Win2000 SP4 like ...

-Avi
-mpeg
-Vob
-mp4-video
-mp4-audio
-mpeg2
-mpeg1
-ogg
-aac (2.0ch, 5.1ch)
-ac3 (2.0ch, 5.1ch)
-mp2
-wave (8,16,20,24,32f bit) (2.0, 5.1)
-mp3 (cbr, vbr)
.... etc

Seeking within streams comes with no problems and therefore also the requested Media time lenghts are correct. Well at least in my Workout environments - please do report bugs if they occur.

Code: Select all

Changes on v1.1 (07/25/2006)

- Everything in the pbi has been checked on proper declarations 
  by using temporary "EnableExplicit" when testing.

- The missing "If *p" checks in some Procedures have been added.

- Now the WideCharString memory is allocated within the LoadMedia() Procedure.
  Therefore on each LoadMedia() call the heap containing the
  WideChar String will be set free at the end of the LoadMedia() Procedure.
  This made the Procedure L(string.s) becoming 
  L(*WideCharPointer, String.s)  ... see inside.

- The FreeMedia() Command now does check'n stop the media state 
  by calling the methods from the interfaces directly.
DshowMedia.pbi
DshowMedia_Example.pb


EDIT: A newer version (v. 1.3) of this include you can find in the german forum: http://www.purebasic.fr/german/viewtopi ... 73#p269873
Last edited by inc. on Mon Dec 27, 2010 4:01 pm, edited 3 times in total.
Check out OOP support for PB here!
KarLKoX
Enthusiast
Enthusiast
Posts: 677
Joined: Mon Oct 06, 2003 7:13 pm
Location: France
Contact:

Post by KarLKoX »

Might be usefull, thanks :)
"Qui baise trop bouffe un poil." P. Desproges

http://karlkox.blogspot.com/
User avatar
Flype
Addict
Addict
Posts: 1542
Joined: Tue Jul 22, 2003 5:02 pm
Location: In a long distant galaxy

Post by Flype »

seems really good... i will look at it closer.
No programming language is perfect. There is not even a single best language.
There are only languages well suited or perhaps poorly suited for particular purposes. Herbert Mayer
buzzqw
Enthusiast
Enthusiast
Posts: 116
Joined: Sat Aug 27, 2005 10:13 pm
Location: Italy
Contact:

Post by buzzqw »

thanks Incredible !

anyway i got always the same error in debugger

Fatal Error: Rendering file failed

with avi,mp3/vob/aac... and i have the varius splitter/decoder , no problem rendering with gspot

BHH
inc.
Enthusiast
Enthusiast
Posts: 406
Joined: Thu May 06, 2004 4:28 pm
Location: Cologne/GER

Post by inc. »

buzzqw wrote:thanks Incredible !

anyway i got always the same error in debugger

Fatal Error: Rendering file failed

with avi,mp3/vob/aac... and i have the varius splitter/decoder , no problem rendering with gspot

BHH
a) Which type of Windows are you running (I tested on WinXP SP2 and Win2k SP4)
b) Are there no other errors in the debug log mentioned?
c) Do replace in the "DshowMedia_Example.pb" the renderers to #default, means:

Code: Select all

If LoadMedia(hMedia, File, hwnd, #VMR7_Windowed, #WaveOutRenderer)
to...

Code: Select all

If LoadMedia(hMedia, File, hwnd, #Default, #Default)
.. and tell me what happens.

If still that error occurs ... tell me what compiling options you do use.
Check out OOP support for PB here!
buzzqw
Enthusiast
Enthusiast
Posts: 116
Joined: Sat Aug 27, 2005 10:13 pm
Location: Italy
Contact:

Post by buzzqw »

Gotcha !

Code: Select all

 
--------- Filtergraph ---------
Default DirectSound Device
Video Renderer
ffdshow Audio Decoder
ffdshow MPEG-4 Video Decoder
AVI Splitter
D:\temp\Battle Royale (2000) Directors Cut Japanese.avi
--------------------------------------
 
lenght = 01:02:29:374 (hh:mm:ss:ms)
FPS    = 23.976
Width  = 640
Height = 352
playing ...
 
esc = exit
c = capture current image to C:/
left/right keys = step forward/backward in 5% steps
up/down keys = alter volume in 2db steps
substituting #WaveOutRenderer with #Default made the program run smooth ! (and btw even with #VMR9_Windowed is ok)
my spec winxp sp2, ati AIW9700pro, using ffdshow and Haali splitter, audio terratek 96/24 DMX

thanks Inc. !!

BHH
inc.
Enthusiast
Enthusiast
Posts: 406
Joined: Thu May 06, 2004 4:28 pm
Location: Cologne/GER

Post by inc. »

(and btw even with #VMR9_Windowed is ok)
my spec winxp sp2
On XP with Dx9 Microsoft even recommends it as the render to use. "VMR9" superceeds the "Overlaymixer", BUT watch out as when using VMR9 the hardware colorspace conversion could be tricky as on my WinXPsp2/Dx9c VMR9 does result in a tiny too bright image. Means wrong YUV to RGB conversion. But thats a Gracards/Driver thing imho or M$ did change something in the hardware handler in VMR9 when accessing the Accelerator of the Gracard.

Its quite unormal that the WaveOut Renderer wont work on your setup. Just for checking: Do use MediaplayerClassic and set its audio out to Waveout and see if also here it wont render your file. If also there it fails to render, then alter your ffdshow audio configuraton and figure out by try&error.

Btw: Even Avisynth Script files will be handled without problems by using these new DShow Media Routines. ;) Before that PB wasnt able to seek within Avisynth frameserved streams.
Check out OOP support for PB here!
THCM
Enthusiast
Enthusiast
Posts: 276
Joined: Fri Apr 25, 2003 5:06 pm
Location: Gummersbach - Germany
Contact:

Post by THCM »

Looks good! Nice work!
The Human Code Machine / Masters' Design Group
swan
Enthusiast
Enthusiast
Posts: 225
Joined: Sat Jul 03, 2004 9:04 am
Location: Sydney Australia
Contact:

Post by swan »

Just the ticket I need at the moment.

Thanx heaps.
Jan Vooijs
Enthusiast
Enthusiast
Posts: 196
Joined: Tue Sep 30, 2003 4:32 pm
Location: The Netherlands

Post by Jan Vooijs »

Amazing!!

I wanted to do something like this but failed horibly!! But seeing this and how simple (better elegant) this is. I tip my head for you Inc!!

You have made MY day (and week, and month and possibly my YEAR)

The people above do NOT know what a gem of code THIS is!!

Any one for a PB version of MSCE (Media Center)??? I can build this know!!

I discovered some (tiny) problems here are my contribution to it:

Code: Select all

; Ansi->Unicode
Procedure.l L(string.s)
	If *out
		; Pointer is already been used, free this FIRST!! 
		; This is NEEDED!! learned this the HARD way!! A memory-leak!!
		FreeMemory( *out)
	EndIf
  	*out = AllocateMemory(Len(string)*2+2)		; *2 cause of unicode char size, and the +2 is for the ZERO at the end (well +1 and 1 for LUCK)..
	PokeS(*out, string, Len(string), #PB_Unicode)
	
	ProcedureReturn *out	
EndProcedure 


Procedure PlayMedia(*p.Dshow_Interfaces)
	If *p
		*p\pControl\run()
	EndIf
EndProcedure


Procedure FreeMedia(*p.Dshow_Interfaces)

	If *p
	  	If Not MediaState( *p) = #State_Stopped
	  		MediaStop( *p)
	  	EndIf
	  	*p\pSeeking\Release()
	  	*p\pVideo\Release()
	  	*p\pAudio\Release()
	  	*p\pWindow\Release()
	  	*p\pEvent\Release()
	  	*p\pControl\Release()
	  	*p\pGraphBuilder\Release()
	  	FreeMemory( *p)
	  	CoUninitialize_()
	  	If *out
		  	FreeMemory( *out)
	  	EndIf
	  	ProcedureReturn = #True
	Else
		ProcedureReturn = #False
	EndIf 
EndProcedure

First the L() proc:
I learned the very hard way (in a server program) that allthough PB gives (all) memory back AFTER program ends it still let the program grow with the amount of everytime reserving x bytes memory, so testing if *out was not null, than remove it, and that is also done in FreeMedia() !!! And the length of the string we need is x but in the manual is stated that there is a ZERO byte AFTER the UNICODE string, so for luck I add 2 bytes AFTER the memory buffer (better SAVE than SORRY and a hard to find bug). In the idea that a unicode char is TWO bytes, so adding 2 feels right.

Second the PlayMedia() proc:
I inserted the if *p code since the rest of the play/stop proc's used it and this one not?? Felt right to do so.

thanks!!

Jan V.
Life goes to Fast, Enjoy!!

PB 4 is to good to be true, wake up man it is NOT a dream THIS is a reality!!!

AMD Athlon on 1.75G, 1Gb ram, 160Gb HD, NVidia FX5200, NEC ND-3500AG DVD+RW and CD+RW, in a Qbic EO3702A and Win XP Pro SP2 (registered)
inc.
Enthusiast
Enthusiast
Posts: 406
Joined: Thu May 06, 2004 4:28 pm
Location: Cologne/GER

Post by inc. »

The people above do NOT know what a gem of code THIS is!!
Ough .... with all honors to your flowers .... but I do think they do if they find it useful ;)
Any one for a PB version of MSCE (Media Center)??? I can build this know!!
This is just a Media"playback" include supporting Directx/Dshow capabilities (well at least some of them). For coding a real Mediacenter you need:
- Displaying using the correct aspect ratio of the Videos! (Im trying to find out how)
- Capturing support in case of wanted VDR capabilities
- Internet Radio (Shoutcast Filter) support
- DVB cards support

so as you see these routines in the include are just a "brick" in the Dshow wall. But I would apreciate if someone with Dshow programming skills could help me making this include bigger and bigger by adding more Dshow routines.

Now to your contributions:

Code: Select all

Procedure PlayMedia(*p.Dshow_Interfaces)
   If *p
      *p\pControl\run()
   EndIf
EndProcedure
Thanks, I recognised that missing pointer check yesterday also ... will be added.

Code: Select all

; Ansi->Unicode
Procedure.l L(string.s)
   If *out
      ; Pointer is already been used, free this FIRST!!
      ; This is NEEDED!! learned this the HARD way!! A memory-leak!!
      FreeMemory( *out)
   EndIf
     *out = AllocateMemory(Len(string)*2+2)      ; *2 cause of unicode char size, and the +2 is for the ZERO at the end (well +1 and 1 for LUCK)..
   PokeS(*out, string, Len(string), #PB_Unicode)
   
   ProcedureReturn *out   
EndProcedure 
Well, I would never free "someone elses" memory pointer if the user just mixes up pointer-variable-names in the code he maybe had declared as global before.
But btw. .... *p isn't declared as global so I do not see your idea?
My choice would be as followed:

Code: Select all

Procedure.l L(string.s) ; Ansi->Unicode
  Protected *out
  *out = AllocateMemory(Len(string)*2) ; *2 cause of unicode char size
  PokeS(*out, string, Len(string), #PB_Unicode)
  ProcedureReturn *out 
EndProcedure 
So a simple "Protected" would make the pointervariable "*p" ... protected. So a user predefined Global pointer using the name "*p" wont mess up things.
("Protections" btw. are also been applied in all other Procedures, well they should be at least ;) )

Code: Select all

Procedure FreeMedia(*p.Dshow_Interfaces)

   If *p
        If Not MediaState( *p) = #State_Stopped
           MediaStop( *p)
        EndIf
        *p\pSeeking\Release()
        *p\pVideo\Release()
        *p\pAudio\Release()
        *p\pWindow\Release()
        *p\pEvent\Release()
        *p\pControl\Release()
        *p\pGraphBuilder\Release()
        FreeMemory( *p)
        CoUninitialize_()
        If *out
           FreeMemory( *out)
        EndIf
        ProcedureReturn = #True
   Else
      ProcedureReturn = #False
   EndIf
EndProcedure
Makes no sense in here as this "If" routine will never reach the correct "*out" pointer for freening the correct memory adress as "*p" has not been declared as Global in the Ansi->Unicode procedure before, so how can the Procedure know what adress is meant?! Maybe "Shared" could be an option. But if you quit the appl. the memory anyhow will be freed, which equals to FreeMemory(-1).

But I see a different more cosmetic issue in that Procedure:
I do call there 2 other defined procedures from that include which isnt the best idea as I should check the state and if needed stop the playback by calling the interface methods directly:

Code: Select all

Procedure FreeMedia(*p.Dshow_Interfaces)
  Protected pfs.l
  If *p
    *p\pControl\GetState(10,@pfs)
    If Not pfs = #State_Stopped
      *p\pControl\stop()
    EndIf
    *p\pSeeking\Release()
    *p\pVideo\Release()
    *p\pAudio\Release()
    *p\pWindow\Release()
    *p\pEvent\Release()
    *p\pControl\Release()
    *p\pGraphBuilder\Release()
    FreeMemory(*p)
    CoUninitialize_()
    ProcedureReturn = #True
  Else
    ProcedureReturn = #False
  EndIf 
EndProcedure
Last edited by inc. on Tue Jul 25, 2006 5:23 pm, edited 1 time in total.
Check out OOP support for PB here!
Jan Vooijs
Enthusiast
Enthusiast
Posts: 196
Joined: Tue Sep 30, 2003 4:32 pm
Location: The Netherlands

Post by Jan Vooijs »

Inc,

Yeah I know this is a brick, but 'lent me one' and I build you a house (castle?), no serious this is the first item to start just playback to start with. It is the base you give I can now start (in fact i am now at this moment).

There is one problem with your addition to my code in this respest:
Well, I would never free "someone elses" memory pointer if the user just mixes up pointer-variable-names in the code, my choice would be as followed:
Code:
Procedure.l L(string.s) ; Ansi->Unicode
Protected *out
*out = AllocateMemory(Len(string)*2) ; *2 cause of unicode char size
PokeS(*out, string, Len(string), #PB_Unicode)
ProcedureReturn *out
EndProcedure
So a simple "Protected" would make the pointervariable "*p" ... protected. So a user predefined Global pointer using the name "*p" wont mess up things.
("Protections" btw. are also been applied in all other Procedures, well they should be at least Wink )
I did defined *out as global (in reworking your code) since in this version you declared it with LOCAL, but at the end of the proc the stack where *out is on (yes it's a pointer) is destroyed so makes it void after use and THAT makes on hell of a memory leak!!! Thank you!

In converting your include file. I discovered your AUDIO problem:

Code: Select all

		If AudRenderer = #WaveOutRenderer
			If CoCreateInstance_( @CLSID_AudioRender, #Null, #CLSCTX_INPROC, @IID_IBaseFilter, @pAudR) = #S_OK
				If *p\pGraphBuilder\AddFilter( pAudR, L( "AudioWaveOut Renderer")) = #S_OK
This is from LoadMedia(), the compiler chokes it does NOT know what pAudR is for a type?? Help me on this one?? Is it IBaseFilter or just a simple .l or ???

And found another one who is missing this time it is missing:

Code: Select all

If *p\pGraphBuilder\EnumFilters( @pEnum.IEnumFilters) = #S_OK
So this time there is no ref for: ".IEnumFilters" is also missing from PB like as you stated "Structure FILTER_INFO" is missing from PB.

By the way, the list you gave are some of the needed items to do but this is a start.

And yes I hope to discover (in the long run) to mix normal TV and DVB-s, DVB-T and DVB-s (ATSC in the USA) all together. And TeleText (closed caption) and the kitchen sink.

And yes scheduling the works a complete MCE!! Even better than the version MS has made. And to be clear yes I have a legal copy of Win MSCE 2005, but the program has severe limitations/bugs and problems of all sort.

I even will do a 'remote control' (and viewing) by the internet. So you can program your MCE from work or any place.

Thanks for all the fish!! And my favorite number is 42! (pity i'am 47 now :( )

Jan V.

(edit for the missing .IEnumFilters /edit)
Life goes to Fast, Enjoy!!

PB 4 is to good to be true, wake up man it is NOT a dream THIS is a reality!!!

AMD Athlon on 1.75G, 1Gb ram, 160Gb HD, NVidia FX5200, NEC ND-3500AG DVD+RW and CD+RW, in a Qbic EO3702A and Win XP Pro SP2 (registered)
inc.
Enthusiast
Enthusiast
Posts: 406
Joined: Thu May 06, 2004 4:28 pm
Location: Cologne/GER

Post by inc. »

I did defined *out as global (in reworking your code) since in this version you declared it with LOCAL, but at the end of the proc the stack where *out is on (yes it's a pointer) is destroyed so makes it void after use and THAT makes on hell of a memory leak!!! Thank you!
Did I miss something? :

Code: Select all

Procedure.l L(string.s) ; Ansi->Unicode
  *out = AllocateMemory(Len(string)*2) ; *2 cause of unicode char size
  PokeS(*out, string, Len(string), #PB_Unicode)
  ProcedureReturn *out 
EndProcedure 
The memory at "*out" here is heap allocated, or am I wrong? ! (Like "new" in C++) So the pointer/adress result from this procedure will be served to the Widechar based Functions where that pointer as argument is needed while the adress is kept valid.

EDIT: Yes it is, look at Freaks comment further below: http://www.purebasic.fr/english/viewtop ... emory+heap
Or the post further below from Traumatic and his L() example: http://www.purebasic.fr/english/viewtop ... teinstance

Code: Select all

 If AudRenderer = #WaveOutRenderer
         If CoCreateInstance_( @CLSID_AudioRender, #Null, #CLSCTX_INPROC, @IID_IBaseFilter, @pAudR) = #S_OK
            If *p\pGraphBuilder\AddFilter( pAudR, L( "AudioWaveOut Renderer")) = #S_OK 
"pAudR" in here is just a "pointer" to an IID_IBaseFilter interface which will be served to the AddFilter() method of the Graphbuilder Interface, and as I do not need to access any of the "IBaseFilter" Methods of the Audiorenderer therefore I do not need to define it as ".IBaseFilter".
So the AddFilter() Method just receives a pointer. ... but I'll check that.
So this time there is no ref for: ".IEnumFilters" is also missing from PB like as you stated "Structure FILTER_INFO" is missing from PB.
Which version of PB are you using? The latest release or not? On my Compiling-Runs I get no Structure missing error. (No extra .res files added)
So I'll add that structure like the "Filter_Info" one, ... also here by using CompilerIf Defined(#PB_Structure...) = #False
By the way, the list you gave are some of the needed items to do but this is a start.
I already did assemble a big Dshow include file containing all needed IIDs, CLSIDs and Constants ... but till Im not shure if all needed stuff is included. So youre right, these lines in the actual include are just the "start".
Last edited by inc. on Tue Jul 25, 2006 6:18 pm, edited 1 time in total.
Check out OOP support for PB here!
Jan Vooijs
Enthusiast
Enthusiast
Posts: 196
Joined: Tue Sep 30, 2003 4:32 pm
Location: The Netherlands

Post by Jan Vooijs »

Inc,

You did not miss something. But as you write putting *out global is my choice. And yes again the memory buffer is on the heap but after YOUR version of L() that memory is UNREFERENCED and there for memory untraceble!! Aka a memory hole (=leak)!!

I am rewriting in so far using "EnableExplicit" now every variable has to be declared. That is how i found pAudr, and since the compiler now must now every structure it is now complaining about .IEnumFilters while not using explicite the complire make's it an simple .l pointer.

So that is why i find al these 'features' but that is not a problem for me. It helps me understand the code better. And I like my programming 'explicite'
But found your Audio problem solved did it not? :)

And by the way rereading your post AFTER the edit, so I have to edit mine (grin grin), the SDK cleary states that pAudr recieves a pointer to a interface pointer
Address of pointer variable that receives the interface pointer requested in riid. Upon successful return, *ppv contains the requested interface pointer. Upon failure, *ppv contains NULL
So if that would be a simple pointer that holds but as I read it not.

I have the latest public version or PB4 and some of the libraries updated from the beta section since these resolved some errors i found in Gadget, Network and Console.

The rest is vanila PB4.

Jan V.
Last edited by Jan Vooijs on Tue Jul 25, 2006 6:30 pm, edited 1 time in total.
Life goes to Fast, Enjoy!!

PB 4 is to good to be true, wake up man it is NOT a dream THIS is a reality!!!

AMD Athlon on 1.75G, 1Gb ram, 160Gb HD, NVidia FX5200, NEC ND-3500AG DVD+RW and CD+RW, in a Qbic EO3702A and Win XP Pro SP2 (registered)
inc.
Enthusiast
Enthusiast
Posts: 406
Joined: Thu May 06, 2004 4:28 pm
Location: Cologne/GER

Post by inc. »

First: For avoiding confusions I don't catch this line:
Jan Vooijs wrote:But as you write putting *out global is my choice.
Depending on how I did interprete your line: I said that my choice would be to declare *p within the procedure as protected.
And yes again the memory buffer is on the heap but after YOUR version of L() that memory is UNREFERENCED and there for memory untracebled!! Aka a memory hole (=leak)!!
Hmmmm .... can someone confirm that?
If it's the case than Traumatics L() Procedure would be risky too: http://www.purebasic.fr/english/viewtop ... teinstance

BTW. If its the case then the whole InitMedia Procedure would be useless, or not? ;)

Code: Select all

Procedure InitMedia()
  Protected a, b, c, d, e, f
  *p.Dshow_Interfaces = AllocateMemory(SizeOf(Dshow_Interfaces))
  CoInitialize_(0)
  If Not CoCreateInstance_(@CLSID_FilterGraph, #Null, #CLSCTX_INPROC_SERVER, @IID_IGraphBuilder, @*p\pGraphBuilder) = #S_OK 
    Debug "Error: Couldn't initialize the GraphBuilder Interface"
    ProcedureReturn #False
  Else
    a = *p\pGraphBuilder\QueryInterface(@IID_IMediaControl, @*p\pControl)
    b = *p\pGraphBuilder\QueryInterface(@IID_IMediaEventEx, @*p\pEvent)
    c = *p\pGraphBuilder\QueryInterface(@IID_IVideoWindow,  @*p\pWindow)
    d = *p\pGraphBuilder\QueryInterface(@IID_IBasicAudio,   @*p\pAudio)
    e = *p\pGraphBuilder\QueryInterface(@IID_IBasicVideo,   @*p\pVideo)
    f = *p\pGraphBuilder\QueryInterface(@IID_IMediaSeeking, @*p\pSeeking)
    If SUCCEEDED(a) And SUCCEEDED(b) And SUCCEEDED(c) And SUCCEEDED(d) And SUCCEEDED(e) And SUCCEEDED(f) ; Quick check
      ProcedureReturn *p
    Else
      Debug "Error: Query of at least one of the needed Interfaces failed"
      ProcedureReturn #False
    EndIf
  EndIf 
EndProcedure
*p also here obtains a memoryadress by AllocateMemory() and that adress will be finally returned by the procedure. (and with my latest state of understanding I also here forgot to declare *p.Dshow_Interfaces as protected)

But maybe now im totally confused *lol
I am rewriting in so far using "EnableExplicit" now every variable has to be declared. That is how i found pAudr, and since the compiler now must now every structure it is now complaining about .IEnumFilters while not using explicite the complire make's it an simple .l pointer.

So that is why i find al these 'features' but that is not a problem for me. It helps me understand the code better. And I like my programming 'explicite'
Yes, I also did read these days in another thread that generating includes using "explicit" is the more secure way but should be removed when releasing the include. Ill go into the code this evening checking it using "EnableExplicit". Thanks for reminding.
But found your Audio problem solved did it not? :)
Im not shure I catched your last line well. Is the individual audiorenderer problem solved now or not? (Which btw. I cant reproduce) Thats why in the case above I guessed it was a DS Systemsetup issue. Im still at work, so Ill get into it later.
Check out OOP support for PB here!
Post Reply