void AudioDeviceElement::readFramesLoop(AudioDeviceElement *self) { #ifdef Q_OS_WIN32 // Initialize the COM library in multithread mode. CoInitializeEx(NULL, COINIT_MULTITHREADED); #endif QString device = self->m_device; AkAudioCaps caps(self->m_caps); qint64 streamId = Ak::id(); AkFrac timeBase(1, caps.rate()); if (self->m_audioDevice->init(device, caps)) { while (self->m_readFramesLoop) { if (self->m_pause) { QThread::msleep(PAUSE_TIMEOUT); continue; } int bufferSize = self->m_bufferSize; QByteArray buffer = self->m_audioDevice->read(bufferSize); if (buffer.isEmpty()) return; QByteArray oBuffer(buffer.size(), Qt::Uninitialized); memcpy(oBuffer.data(), buffer.constData(), size_t(buffer.size())); caps.samples() = bufferSize; AkAudioPacket packet(caps, oBuffer); qint64 pts = qint64(QTime::currentTime().msecsSinceStartOfDay() / timeBase.value() / 1e3); packet.setPts(pts); packet.setTimeBase(timeBase); packet.setIndex(0); packet.setId(streamId); emit self->oStream(packet.toPacket()); } self->m_audioDevice->uninit(); } #ifdef Q_OS_WIN32 // Close COM library. CoUninitialize(); #endif }
Timestamp Stream::currentDts() const { return {RAW_GET2(isValid(), cur_dts, AV_NOPTS_VALUE), timeBase()}; }
Timestamp Stream::duration() const { return {RAW_GET2(isValid(), duration, AV_NOPTS_VALUE), timeBase()}; }
Timestamp Stream::startTime() const { return {RAW_GET2(isValid(), start_time, AV_NOPTS_VALUE), timeBase()}; }