Contents

What is Solid

Solid is the new hardware device framework for KDE 4 that features, among other things, a hardware discovery layer which allows you to detect and use devices regardless of operating system or architecture. You can learn more about the Solid project at solid.kde.org.

Who is this tutorial for?

This tutorial is written for developers looking to use the Solid hardware discovery layer within their applications. It can also serve as a good starting point for developers looking to start working on the Solid framework.

Prerequisites

A working KDE4 development environment. Documentation on setting up a KDE environment can be found here.

Listing Devices

Our first program will be a simple console based app that gets a list of all the hardware devices and prints them out to the screen.

Solid::DeviceManager &manager = Solid::DeviceManager::self();

This gets us the device manager. All the devices are queried through and returned from the device manager. Once we have the list of devices we can interact with them as follows:

foreach( Solid::Device device, manager.allDevices() )
{

//print the name of device
kDebug() << device.udi() << endl;

}

device.udi() returns the Unique Device Identifier for the device as a QString, meaning even if you have two cards that are identical the UDI will be, well, unqiue. A case where this is important is where we have a MythTV box with two PVR-250 tv capture cards in it. We will be able to refer to card #1 by it's UDI and card #2 by it's UDI.

Searching for specific devices

This second program makes uses of filters built into the solid framework. Using these filters you can list only devices according to supported capabilities, sub-devices of a given parent, and various predicates. In our example we'll be limiting our list to only audio hardware. A full list of capabilities can be viewed under the Solid::Capability namespace.

//get a list of all devices that are AudioHw
foreach ( Solid::Device device, devices )
{

kDebug() << device.udi() << endl;

}

In this example Solid::DeviceManager::findDevicesFromQuery looks for a device with any parent and the Solid::Capability::AudioHw capability. If we had wanted to specify an AudioHw device with the parent "real_specific_parent" it would look like this:

What do we do with a device once we get it?

Now that we got a device, what do we do with it? First lets look at the relationship between the Solid::Device and Solid::Capability. A Solid::Device can contain many Solid::Capability. A device can be tested to have a capability in the following way:
Solid::DeviceManager &manager = Solid::DeviceManager::self();