[pulseaudio-discuss] [Vala] Issues will vala and pulse vapi

Al Thomas astavale at yahoo.co.uk
Sun Nov 22 10:51:31 PST 2015


> From: Aaron Paden <aaronbpaden at gmail.com>

> Sent: Sunday, 22 November 2015, 2:48
> Subject: Re: [Vala] Issues will vala and pulse vapi
>>  From an object oriented design point of view your SinkSoureList
>>  class is doing too much. Initialisation should be done elsewhere
>>  and I think it is unusual to have GLib.MainLoop within a class.
>>  Some refactoring would be helpful here to see the problem more
> 
> Well I've taken a few classes but I'm definitely at the level of a
> hobbyist, so I have lots of gaps in my understanding of best
> practices. SinkSourceList's purpose is simply to hold a list of pulse
> sources/sinks regardless of what the rest of the application is or

> isn't doing. 


Sounds very reasonable, although I wonder if SinkList and SourceList
should be separate classes. 


The class you are creating is a wrapper around the asynchronous 

PulseAudio API that blocks until the complete list is returned 

or a timeout occurs. It's essentially a snapshot that you can 

then iterate over later. I hope that's a fair summary.

You could think about using a Vala signal instead. Other objects
can hook into this to have a function called when the list is
ready. This is the Vala implementation of the observer pattern.


> It allows you to pass a MainContext to the constructor,> an only creates a MainLoop if MainContext is null. For example, you
> might use SinkSourceList to write a one off utility like pactl list
> short sources. In that case, the application logic really doesn't need
> a mainloop, and the mainloop becomes an implementation detail of pulse

> that can be abstracted away.

>From what I can see creating the list is dependent on a PulseAudio.Context.
I think it would be better to pass an instance of that in the constructor.
Then your initialize_sources method goes, but the code within it becomes
the constructor code block.

You can then create a factory function that returns a PulseAudio context
created in a way that fits your rules. So your current constructor and
initialize_pulse method are taken out of the current class completely
to create a separate factory function. This way you can re-use the context
in other objects you create later, instead of duplicating that code for
each object.

I hope that makes sense of what I meant when I said your current 

class does too much.

> That was my reasoning, anyway. Could be completely faulty, and I'd
> love to be corrected if I've obviously doing something incorrect.


Obviously there isn't a single right way, but generally I find the
SOLID principles helpful when reviewing code. In this case the 'S'
of SOLID applies - the Single Responsibility Principle. You want
your object to create the list, not also set up the PulseAudio context.

All the best with it,

Al


More information about the pulseaudio-discuss mailing list