bool SoundSourceMediaFoundation::readProperties()
{
    PROPVARIANT prop;
    HRESULT hr = S_OK;

    //Get the duration, provided as a 64-bit integer of 100-nanosecond units
    hr = m_pReader->GetPresentationAttribute(MF_SOURCE_READER_MEDIASOURCE,
        MF_PD_DURATION, &prop);
    if (FAILED(hr)) {
        qWarning() << "SSMF: error getting duration";
        return false;
    }
    // QuadPart isn't available on compilers that don't support _int64. Visual
    // Studio 6.0 introduced the type in 1998, so I think we're safe here
    // -bkgood
    m_iDuration = secondsFromMF(prop.hVal.QuadPart);
    m_mfDuration = prop.hVal.QuadPart;
    qDebug() << "SSMF: Duration:" << m_iDuration;
    PropVariantClear(&prop);

    // presentation attribute MF_PD_AUDIO_ENCODING_BITRATE only exists for
    // presentation descriptors, one of which MFSourceReader is not.
    // Therefore, we calculate it ourselves.
    m_iBitrate = kBitsPerSample * kSampleRate * kNumChannels;

    return true;
}
inline unsigned long SoundSourceMediaFoundation::length()
{
    unsigned long len(secondsFromMF(m_mfDuration) * kSampleRate * kNumChannels);
    return len % kNumChannels == 0 ? len : len + 1;
}
inline int AudioDecoderMediaFoundation::numSamples()
{
    int len(secondsFromMF(m_mfDuration) * m_iSampleRate * m_iChannels);
    return len % m_iChannels == 0 ? len : len + 1;
}