QByteArray QAudioDeviceInfoInternal::defaultOutputDevice() { QList<QByteArray> devices = availableDevices(QAudio::AudioOutput); if(devices.size() == 0) return QByteArray(); return devices.first(); }
QByteArray QAudioDeviceInfoInternal::defaultInputDevice() { QList<QByteArray> list = availableDevices(QAudio::AudioInput); if (list.size() > 0) return list.at(0); else return QByteArray(); }
bool QAudioDeviceInfoInternal::open() { int err = 0; QString dev = device; QList<QByteArray> devices = availableDevices(mode); if(dev.compare(QLatin1String("default")) == 0) { #if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14) if (devices.size() > 0) dev = QLatin1String(devices.first().constData()); else return false; #else dev = QLatin1String("hw:0,0"); #endif } else { #if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14) dev = device; #else int idx = 0; char *name; QString shortName = device.mid(device.indexOf(QLatin1String("="),0)+1); while(snd_card_get_name(idx,&name) == 0) { if(dev.contains(QLatin1String(name))) break; idx++; } dev = QString(QLatin1String("hw:%1,0")).arg(idx); #endif } if(mode == QAudio::AudioOutput) { err=snd_pcm_open( &handle,dev.toLocal8Bit().constData(),SND_PCM_STREAM_PLAYBACK,0); } else { err=snd_pcm_open( &handle,dev.toLocal8Bit().constData(),SND_PCM_STREAM_CAPTURE,0); } if(err < 0) { handle = 0; return false; } return true; }
QAudioDeviceInfo QAudioDeviceFactory::defaultOutputDevice() { #if !defined (QT_NO_LIBRARY) && !defined(QT_NO_SETTINGS) QAudioSystemFactoryInterface* plugin = qobject_cast<QAudioSystemFactoryInterface*>(audioLoader()->instance(defaultKey())); if (plugin) { QList<QByteArray> list = plugin->availableDevices(QAudio::AudioOutput); if (list.size() > 0) return QAudioDeviceInfo(defaultKey(), list.at(0), QAudio::AudioOutput); } // if no plugin is marked as default or if the default plugin doesn't have any output device, // return the first output available from other plugins. QList<QAudioDeviceInfo> outputDevices = availableDevices(QAudio::AudioOutput); if (!outputDevices.isEmpty()) return outputDevices.first(); #endif return QAudioDeviceInfo(); }
void vulkan_choose_physical_device(ReaperRoot& root, VulkanBackend& backend, PhysicalDeviceInfo& physicalDeviceInfo) { uint32_t deviceCount = 0; Assert(vkEnumeratePhysicalDevices(backend.instance, &deviceCount, nullptr) == VK_SUCCESS); Assert(deviceCount > 0); log_debug(root, "vulkan: enumerating {} physical devices", deviceCount); std::vector<VkPhysicalDevice> availableDevices(deviceCount); Assert(vkEnumeratePhysicalDevices(backend.instance, &deviceCount, &availableDevices[0]) == VK_SUCCESS, "error occurred during physical devices enumeration"); uint32_t selected_queue_family_index = UINT32_MAX; uint32_t selected_present_queue_family_index = UINT32_MAX; // Duplicated two times TODO merge std::vector<const char*> extensions = {VK_KHR_SWAPCHAIN_EXTENSION_NAME}; VkPhysicalDevice chosenPhysicalDevice = VK_NULL_HANDLE; for (auto& device : availableDevices) { if (vulkan_check_physical_device(root.renderer->window, device, backend.presentInfo.surface, extensions, selected_queue_family_index, selected_present_queue_family_index)) { chosenPhysicalDevice = device; break; } } Assert(chosenPhysicalDevice != VK_NULL_HANDLE, "could not select physical device based on the chosen properties"); physicalDeviceInfo.graphicsQueueIndex = selected_queue_family_index; physicalDeviceInfo.presentQueueIndex = selected_present_queue_family_index; vkGetPhysicalDeviceMemoryProperties(chosenPhysicalDevice, &physicalDeviceInfo.memory); // re-fetch device infos TODO avoid VkPhysicalDeviceProperties physicalDeviceProperties; vkGetPhysicalDeviceProperties(chosenPhysicalDevice, &physicalDeviceProperties); log_info(root, "vulkan: selecting device '{}'", physicalDeviceProperties.deviceName); log_debug(root, "- type = {}", vulkan_physical_device_type_name(physicalDeviceProperties.deviceType)); uint32_t apiVersion = physicalDeviceProperties.apiVersion; uint32_t driverVersion = physicalDeviceProperties.driverVersion; log_debug(root, "- api version = {}.{}.{}", VK_VERSION_MAJOR(apiVersion), VK_VERSION_MINOR(apiVersion), VK_VERSION_PATCH(apiVersion)); log_debug(root, "- driver version = {}.{}.{}", VK_VERSION_MAJOR(driverVersion), VK_VERSION_MINOR(driverVersion), VK_VERSION_PATCH(driverVersion)); log_debug(root, "- memory type count = {}, memory heap count = {}", physicalDeviceInfo.memory.memoryTypeCount, physicalDeviceInfo.memory.memoryHeapCount); for (u32 i = 0; i < physicalDeviceInfo.memory.memoryHeapCount; ++i) { VkMemoryHeap& heap = physicalDeviceInfo.memory.memoryHeaps[i]; log_debug(root, "- heap {}: available size = {}, flags = {}", i, heap.size, heap.flags); } backend.physicalDevice = chosenPhysicalDevice; }
bool QAlsaAudioDeviceInfo::testSettings(const QAudioFormat& format) const { // Set nearest to closest settings that do work. // See if what is in settings will work (return value). int err = -1; snd_pcm_t* pcmHandle; snd_pcm_hw_params_t *params; QString dev; #if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14) dev = device; if (dev.compare(QLatin1String("default")) == 0) { QList<QByteArray> devices = availableDevices(QAudio::AudioOutput); if (!devices.isEmpty()) dev = QLatin1String(devices.first().constData()); } #else if (dev.compare(QLatin1String("default")) == 0) { dev = QLatin1String("hw:0,0"); } else { int idx = 0; char *name; QString shortName = device.mid(device.indexOf(QLatin1String("="),0)+1); while(snd_card_get_name(idx,&name) == 0) { if(shortName.compare(QLatin1String(name)) == 0) break; idx++; } dev = QString(QLatin1String("hw:%1,0")).arg(idx); } #endif snd_pcm_stream_t stream = mode == QAudio::AudioOutput ? SND_PCM_STREAM_PLAYBACK : SND_PCM_STREAM_CAPTURE; if (snd_pcm_open(&pcmHandle, dev.toLocal8Bit().constData(), stream, 0) < 0) return false; snd_pcm_nonblock(pcmHandle, 0); snd_pcm_hw_params_alloca(¶ms); snd_pcm_hw_params_any(pcmHandle, params); // set the values! snd_pcm_hw_params_set_channels(pcmHandle, params, format.channelCount()); snd_pcm_hw_params_set_rate(pcmHandle, params, format.sampleRate(), 0); snd_pcm_format_t pcmFormat = SND_PCM_FORMAT_UNKNOWN; switch (format.sampleSize()) { case 8: if (format.sampleType() == QAudioFormat::SignedInt) pcmFormat = SND_PCM_FORMAT_S8; else if (format.sampleType() == QAudioFormat::UnSignedInt) pcmFormat = SND_PCM_FORMAT_U8; break; case 16: if (format.sampleType() == QAudioFormat::SignedInt) { pcmFormat = format.byteOrder() == QAudioFormat::LittleEndian ? SND_PCM_FORMAT_S16_LE : SND_PCM_FORMAT_S16_BE; } else if (format.sampleType() == QAudioFormat::UnSignedInt) { pcmFormat = format.byteOrder() == QAudioFormat::LittleEndian ? SND_PCM_FORMAT_U16_LE : SND_PCM_FORMAT_U16_BE; } break; case 32: if (format.sampleType() == QAudioFormat::SignedInt) { pcmFormat = format.byteOrder() == QAudioFormat::LittleEndian ? SND_PCM_FORMAT_S32_LE : SND_PCM_FORMAT_S32_BE; } else if (format.sampleType() == QAudioFormat::UnSignedInt) { pcmFormat = format.byteOrder() == QAudioFormat::LittleEndian ? SND_PCM_FORMAT_U32_LE : SND_PCM_FORMAT_U32_BE; } else if (format.sampleType() == QAudioFormat::Float) { pcmFormat = format.byteOrder() == QAudioFormat::LittleEndian ? SND_PCM_FORMAT_FLOAT_LE : SND_PCM_FORMAT_FLOAT_BE; } } if (pcmFormat != SND_PCM_FORMAT_UNKNOWN) err = snd_pcm_hw_params_set_format(pcmHandle, params, pcmFormat); // For now, just accept only audio/pcm codec if (!format.codec().startsWith(QLatin1String("audio/pcm"))) err = -1; if (err >= 0 && format.channelCount() != -1) { err = snd_pcm_hw_params_test_channels(pcmHandle, params, format.channelCount()); if (err >= 0) err = snd_pcm_hw_params_set_channels(pcmHandle, params, format.channelCount()); } if (err >= 0 && format.sampleRate() != -1) { err = snd_pcm_hw_params_test_rate(pcmHandle, params, format.sampleRate(), 0); if (err >= 0) err = snd_pcm_hw_params_set_rate(pcmHandle, params, format.sampleRate(), 0); } if (err >= 0 && pcmFormat != SND_PCM_FORMAT_UNKNOWN) err = snd_pcm_hw_params_set_format(pcmHandle, params, pcmFormat); if (err >= 0) err = snd_pcm_hw_params(pcmHandle, params); snd_pcm_close(pcmHandle); return (err == 0); }