             return nil
         }
 
-        return clockSourceNameForClockSourceID(sourceID, forChannel: channel, andDirection: direction)
+        return sourceID
+    }
+
+    /**
+        The clock source name for the channel number and direction specified.
+
+        - Returns: *(optional)* A `String` containing the clock source name.
+     */
+    public func clockSourceForChannel(channel: UInt32, andDirection direction: Direction) -> String? {
+        if let sourceID = clockSourceIDForChannel(channel, andDirection: direction) {
+            return clockSourceNameForClockSourceID(sourceID, forChannel: channel, andDirection: direction)
+        }
+
+        return nil
+    }
+
+    /**
+        A list of clock source identifiers for the channel number and direction specified.
+
+        - Returns: *(optional)* A `UInt32` array containing all the clock source identifiers.
+     */
+    public func clockSourceIDsForChannel(channel: UInt32, andDirection direction: Direction) -> [UInt32]? {
+        var address = AudioObjectPropertyAddress(
+            mSelector: kAudioDevicePropertyClockSources,
+            mScope: directionToScope(direction),
+            mElement: channel
+        )
+
+        if !AudioObjectHasProperty(deviceID, &address) {
+            return nil
+        }
+
+        var clockSourceIDs = [UInt32]()
+        let status = getPropertyDataArray(address, value: &clockSourceIDs, andDefaultValue: 0)
+
+        if noErr != status {
+            return nil
+        }
+
+        return clockSourceIDs
     }
 
     /**

        let status = getPropertyData(address, andValue: &translation)

        return noErr == status ? (name as String) : nil
    }

    private class func defaultDeviceOfType(deviceType: AudioObjectPropertySelector) -> AMAudioDevice? {

            return nil
        }

        if let clockSourceIDs = clockSourceIDsForChannel(channel, andDirection: direction) {
            return clockSourceIDs.map { (clockSourceID) -> String in
                // We expect clockSourceNameForClockSourceID to never fail in this case, 
                // but in the unlikely case it does, we provide a default value.
                clockSourceNameForClockSourceID(clockSourceID, forChannel: channel, andDirection: direction) ?? "Clock source \(clockSourceID)"
            }
        }

        return nil
    }

    /**
        Returns the clock source name for a given clock source ID in a given channel and direction.
     
        - Returns: *(optional)* A `String` with the source clock name.
     */
    public func clockSourceNameForClockSourceID(clockSourceID: UInt32, forChannel channel: UInt32, andDirection direction: Direction) -> String? {
        var name: CFString = ""
        var theClockSourceID = clockSourceID

