bool BZip2Archive::extract(const quint64 index, QIODevice *target) { if (index != 0) { setErrorString(tr("index out of bounds")); return false; } if (!seek(0, RelativeToBeginning, 0)) return errorIoDevice(inputDevice()); CompressionCodec *decoder = CreateDecoderForName("BZip2", this); if (!decoder) return errorOutOfMemory(); decoder->setInputDevice(inputDevice()); decoder->setOutputDevice(target); bool ret = decoder->code(); if (!ret) setErrorString(decoder->errorString()); delete decoder; return ret; }
void MusicAudioRecorderWidget::createAudioInput() { if (m_mpInputDevSound != 0) { disconnect(m_mpInputDevSound, 0, this, 0); m_mpInputDevSound = 0; } QAudioDeviceInfo inputDevice(QAudioDeviceInfo::defaultInputDevice()); m_mpAudioInputSound = new QAudioInput(inputDevice, m_mFormatSound, this); }
void MidiPlugin::closeInput(quint32 input) { qDebug() << Q_FUNC_INFO; MidiInputDevice* dev = inputDevice(input); if (dev != NULL && dev->isOpen() == true) { dev->close(); disconnect(dev, SIGNAL(valueChanged(QVariant,ushort,uchar)), this, SLOT(slotValueChanged(QVariant,ushort,uchar))); } }
void MidiPlugin::openInput(quint32 input) { qDebug() << "MIDI Plugin open Input: " << input; MidiInputDevice* dev = inputDevice(input); if (dev != NULL && dev->isOpen() == false) { dev->open(); connect(dev, SIGNAL(valueChanged(QVariant,ushort,uchar)), this, SLOT(slotValueChanged(QVariant,ushort,uchar))); } }
// bzip2 archives are very simple: they're simply the compressed stream // dumped to a file(!) bool BZip2Archive::open(QIODevice *file, const quint64 maxCheckStartPosition) { pushInputDevice(file); QByteArray sig; if (!readBuffer(&sig, 3)) return errorIoDevice(inputDevice()); if (sig != "BZh") return errorBadMagic("bzip2"); if (!seek(0, RelativeToBeginning, 0)) return errorIoDevice(inputDevice()); ArchiveItem item; item.setProperty(ArchiveItem::CompressedSize, inputDevice()->size()); item.setProperty(ArchiveItem::CompressionMethod, ArchiveItem::CompressionMethodBzip2); addItem(item); return true; }
QString MidiPlugin::inputInfo(quint32 input) { qDebug() << Q_FUNC_INFO; QString str; /* str += QString("<HTML>"); str += QString("<HEAD>"); str += QString("<TITLE>%1</TITLE>").arg(name()); str += QString("</HEAD>"); str += QString("<BODY>"); */ if (input == QLCIOPlugin::invalidLine()) { str += QString("<BR><B>%1</B>").arg(tr("No input support available.")); return str; } MidiInputDevice* dev = inputDevice(input); if (dev != NULL) { QString status; str += QString("<H3>%1 %2</H3>").arg(tr("Input")).arg(inputs()[input]); str += QString("<P>"); if (dev->isOpen() == true) status = tr("Open"); else status = tr("Not Open"); str += QString("%1: %2").arg(tr("Status")).arg(status); str += QString("</P>"); } else { if (input < (quint32)inputs().length()) str += QString("<H3>%1 %2</H3>").arg(tr("Invalid Input")).arg(inputs()[input]); } str += QString("</BODY>"); str += QString("</HTML>"); return str; }
void PulseAudioSystem::eventCallback(pa_mainloop_api *api, pa_defer_event *) { api->defer_enable(pade, false); if (! bSourceDone || ! bSinkDone || ! bServerDone) return; AudioInputPtr ai = g.ai; AudioOutputPtr ao = g.ao; AudioInput *raw_ai = ai.get(); AudioOutput *raw_ao = ao.get(); PulseAudioInput *pai = dynamic_cast<PulseAudioInput *>(raw_ai); PulseAudioOutput *pao = dynamic_cast<PulseAudioOutput *>(raw_ao); if (raw_ao) { QString odev = outputDevice(); pa_stream_state ost = pasOutput ? pa_stream_get_state(pasOutput) : PA_STREAM_TERMINATED; bool do_stop = false; bool do_start = false; if (! pao && (ost == PA_STREAM_READY)) { do_stop = true; } else if (pao) { switch (ost) { case PA_STREAM_TERMINATED: { if (pasOutput) pa_stream_unref(pasOutput); pa_sample_spec pss = qhSpecMap.value(odev); pa_channel_map pcm = qhChanMap.value(odev); if ((pss.format != PA_SAMPLE_FLOAT32NE) && (pss.format != PA_SAMPLE_S16NE)) pss.format = PA_SAMPLE_FLOAT32NE; if (pss.rate == 0) pss.rate = SAMPLE_RATE; if ((pss.channels == 0) || (! g.s.doPositionalAudio())) pss.channels = 1; pasOutput = pa_stream_new(pacContext, mumble_sink_input, &pss, (pss.channels == 1) ? NULL : &pcm); pa_stream_set_state_callback(pasOutput, stream_callback, this); pa_stream_set_write_callback(pasOutput, write_callback, this); } case PA_STREAM_UNCONNECTED: do_start = true; break; case PA_STREAM_READY: { if (g.s.iOutputDelay != iDelayCache) { do_stop = true; } else if (g.s.doPositionalAudio() != bPositionalCache) { do_stop = true; } else if (odev != qsOutputCache) { do_stop = true; } break; } default: break; } } if (do_stop) { qWarning("PulseAudio: Stopping output"); pa_stream_disconnect(pasOutput); iSinkId = -1; } else if (do_start) { qWarning("PulseAudio: Starting output: %s", qPrintable(odev)); pa_buffer_attr buff; const pa_sample_spec *pss = pa_stream_get_sample_spec(pasOutput); const size_t sampleSize = (pss->format == PA_SAMPLE_FLOAT32NE) ? sizeof(float) : sizeof(short); const unsigned int iBlockLen = ((pao->iFrameSize * pss->rate) / SAMPLE_RATE) * pss->channels * static_cast<unsigned int>(sampleSize); buff.tlength = iBlockLen * (g.s.iOutputDelay+1); buff.minreq = iBlockLen; buff.maxlength = -1; buff.prebuf = -1; buff.fragsize = iBlockLen; iDelayCache = g.s.iOutputDelay; bPositionalCache = g.s.doPositionalAudio(); qsOutputCache = odev; pa_stream_connect_playback(pasOutput, qPrintable(odev), &buff, PA_STREAM_ADJUST_LATENCY, NULL, NULL); pa_context_get_sink_info_by_name(pacContext, qPrintable(odev), sink_info_callback, this); } } if (raw_ai) { QString idev = inputDevice(); pa_stream_state ist = pasInput ? pa_stream_get_state(pasInput) : PA_STREAM_TERMINATED; bool do_stop = false; bool do_start = false; if (! pai && (ist == PA_STREAM_READY)) { do_stop = true; } else if (pai) { switch (ist) { case PA_STREAM_TERMINATED: { if (pasInput) pa_stream_unref(pasInput); pa_sample_spec pss = qhSpecMap.value(idev); if ((pss.format != PA_SAMPLE_FLOAT32NE) && (pss.format != PA_SAMPLE_S16NE)) pss.format = PA_SAMPLE_FLOAT32NE; if (pss.rate == 0) pss.rate = SAMPLE_RATE; pss.channels = 1; pasInput = pa_stream_new(pacContext, "Microphone", &pss, NULL); pa_stream_set_state_callback(pasInput, stream_callback, this); pa_stream_set_read_callback(pasInput, read_callback, this); } case PA_STREAM_UNCONNECTED: do_start = true; break; case PA_STREAM_READY: { if (idev != qsInputCache) { do_stop = true; } break; } default: break; } } if (do_stop) { qWarning("PulseAudio: Stopping input"); pa_stream_disconnect(pasInput); } else if (do_start) { qWarning("PulseAudio: Starting input %s",qPrintable(idev)); pa_buffer_attr buff; const pa_sample_spec *pss = pa_stream_get_sample_spec(pasInput); const size_t sampleSize = (pss->format == PA_SAMPLE_FLOAT32NE) ? sizeof(float) : sizeof(short); const unsigned int iBlockLen = ((pai->iFrameSize * pss->rate) / SAMPLE_RATE) * pss->channels * static_cast<unsigned int>(sampleSize); buff.tlength = iBlockLen; buff.minreq = iBlockLen; buff.maxlength = -1; buff.prebuf = -1; buff.fragsize = iBlockLen; qsInputCache = idev; pa_stream_connect_record(pasInput, qPrintable(idev), &buff, PA_STREAM_ADJUST_LATENCY); } } if (raw_ai) { QString odev = outputDevice(); QString edev = qhEchoMap.value(odev); pa_stream_state est = pasSpeaker ? pa_stream_get_state(pasSpeaker) : PA_STREAM_TERMINATED; bool do_stop = false; bool do_start = false; if ((! pai || ! g.s.doEcho()) && (est == PA_STREAM_READY)) { do_stop = true; } else if (pai && g.s.doEcho()) { switch (est) { case PA_STREAM_TERMINATED: { if (pasSpeaker) pa_stream_unref(pasSpeaker); pa_sample_spec pss = qhSpecMap.value(edev); pa_channel_map pcm = qhChanMap.value(edev); if ((pss.format != PA_SAMPLE_FLOAT32NE) && (pss.format != PA_SAMPLE_S16NE)) pss.format = PA_SAMPLE_FLOAT32NE; if (pss.rate == 0) pss.rate = SAMPLE_RATE; if ((pss.channels == 0) || (! g.s.bEchoMulti)) pss.channels = 1; pasSpeaker = pa_stream_new(pacContext, mumble_echo, &pss, (pss.channels == 1) ? NULL : &pcm); pa_stream_set_state_callback(pasSpeaker, stream_callback, this); pa_stream_set_read_callback(pasSpeaker, read_callback, this); } case PA_STREAM_UNCONNECTED: do_start = true; break; case PA_STREAM_READY: { if (g.s.bEchoMulti != bEchoMultiCache) { do_stop = true; } else if (edev != qsEchoCache) { do_stop = true; } break; } default: break; } } if (do_stop) { qWarning("PulseAudio: Stopping echo"); pa_stream_disconnect(pasSpeaker); } else if (do_start) { qWarning("PulseAudio: Starting echo: %s", qPrintable(edev)); pa_buffer_attr buff; const pa_sample_spec *pss = pa_stream_get_sample_spec(pasSpeaker); const size_t sampleSize = (pss->format == PA_SAMPLE_FLOAT32NE) ? sizeof(float) : sizeof(short); const unsigned int iBlockLen = ((pai->iFrameSize * pss->rate) / SAMPLE_RATE) * pss->channels * static_cast<unsigned int>(sampleSize); buff.tlength = iBlockLen; buff.minreq = iBlockLen; buff.maxlength = -1; buff.prebuf = -1; buff.fragsize = iBlockLen; bEchoMultiCache = g.s.bEchoMulti; qsEchoCache = edev; pa_stream_connect_record(pasSpeaker, qPrintable(edev), &buff, PA_STREAM_ADJUST_LATENCY); } } }
void MidiEnumeratorPrivate::rescan() { qDebug() << Q_FUNC_INFO; if (m_alsa == NULL) return; bool changed = false; QList <MidiOutputDevice*> destroyOutputs(m_outputDevices); QList <MidiInputDevice*> destroyInputs(m_inputDevices); snd_seq_client_info_t* clientInfo = NULL; snd_seq_client_info_alloca(&clientInfo); snd_seq_port_info_t* portInfo = NULL; snd_seq_port_info_alloca(&portInfo); snd_seq_client_info_set_client(clientInfo, 0); while (snd_seq_query_next_client(m_alsa, clientInfo) == 0) { /* Get the client ID */ int client = snd_seq_client_info_get_client(clientInfo); /* Ignore our own client */ if (m_address->client == client) continue; /* Go thru all available ports in the client */ snd_seq_port_info_set_client(portInfo, client); snd_seq_port_info_set_port(portInfo, -1); while (snd_seq_query_next_port(m_alsa, portInfo) == 0) { const snd_seq_addr_t* address = snd_seq_port_info_get_addr(portInfo); if (address == NULL) continue; uint caps = snd_seq_port_info_get_capability(portInfo); if (caps & SND_SEQ_PORT_CAP_READ) { // Don't expose own ports QString name = AlsaMidiUtil::extractName(m_alsa, address); if (name.contains("__QLC__") == true) continue; QVariant uid = AlsaMidiUtil::addressToVariant(address); MidiInputDevice* dev = inputDevice(uid); if (dev == NULL) { AlsaMidiInputDevice* dev = new AlsaMidiInputDevice( uid, name, address, m_alsa, m_inputThread, this); m_inputDevices << dev; changed = true; } else { destroyInputs.removeAll(dev); } } if (caps & SND_SEQ_PORT_CAP_WRITE) { // Don't expose own ports QString name = AlsaMidiUtil::extractName(m_alsa, address); if (name.contains("__QLC__") == true) continue; QVariant uid = AlsaMidiUtil::addressToVariant(address); MidiOutputDevice* dev = outputDevice(uid); if (dev == NULL) { AlsaMidiOutputDevice* dev = new AlsaMidiOutputDevice( uid, name, address, m_alsa, m_address, this); m_outputDevices << dev; changed = true; } else { destroyOutputs.removeAll(dev); } } } } foreach (MidiOutputDevice* dev, destroyOutputs) { m_outputDevices.removeAll(dev); delete dev; changed = true; }
void MidiEnumeratorPrivate::rescan() { qDebug() << Q_FUNC_INFO; bool changed = false; QList <MidiOutputDevice*> destroyOutputs(m_outputDevices); QList <MidiInputDevice*> destroyInputs(m_inputDevices); /* Find out which devices are still present */ ItemCount numDevices = MIDIGetNumberOfDevices(); for (ItemCount devIndex = 0; devIndex < numDevices; devIndex++) { MIDIDeviceRef dev = MIDIGetDevice(devIndex); ItemCount numEntities = MIDIDeviceGetNumberOfEntities(dev); for (ItemCount entIndex = 0; entIndex < numEntities; entIndex++) { MIDIEntityRef entity = MIDIDeviceGetEntity(dev, entIndex); /* Get the entity's UID */ QVariant uid = extractUID(entity); if (uid.isValid() == false) continue; QString name = extractName(entity); qDebug() << Q_FUNC_INFO << "Found device:" << name << "UID:" << uid.toString(); ItemCount destCount = MIDIEntityGetNumberOfDestinations(entity); if (destCount > 0) { MidiOutputDevice* dev = outputDevice(uid); if (dev == NULL) { CoreMidiOutputDevice* dev = new CoreMidiOutputDevice( uid, name, entity, m_client, this); m_outputDevices << dev; changed = true; } else { destroyOutputs.removeAll(dev); } } ItemCount srcCount = MIDIEntityGetNumberOfSources(entity); if (srcCount > 0) { MidiInputDevice* dev = inputDevice(uid); if (dev == NULL) { CoreMidiInputDevice* dev = new CoreMidiInputDevice( uid, name, entity, m_client, this); m_inputDevices << dev; changed = true; } else { destroyInputs.removeAll(dev); } } } } foreach (MidiOutputDevice* dev, destroyOutputs) { m_outputDevices.removeAll(dev); delete dev; changed = true; }