31 #ifdef USING_PULSEOUTPUT
43 #include "libavcodec/avcodec.h"
48 #define LOC QString("AO: ")
58 const QString &main_device,
const QString &passthru_device,
59 AudioFormat format,
int channels, AVCodecID codec,
int samplerate,
64 main_device, passthru_device, format, channels, codec, samplerate,
65 source, set_initial_vol, passthru, upmixer_startup, custom);
71 const QString &main_device,
const QString &passthru_device,
76 return OpenAudio(settings, willsuspendpa);
80 [[maybe_unused]]
bool willsuspendpa)
87 willsuspendpa =
false;
90 bool pulsestatus =
false;
93 static bool warned =
false;
97 LOG(VB_GENERAL, LOG_WARNING,
98 "WARNING: ***Pulse Audio is running***");
101 #endif // USING_PULSE
105 if (main_device.startsWith(
"PulseAudio:"))
107 #ifdef USING_PULSEOUTPUT
110 LOG(VB_GENERAL, LOG_ERR,
"Audio output device is set to PulseAudio "
111 "but PulseAudio support is not compiled in!");
113 #endif // USING_PULSEOUTPUT
115 if (main_device.startsWith(
"NULL"))
123 bool ispulse =
false;
127 if (main_device.startsWith(
"ALSA:"))
129 QString device_name = main_device;
131 device_name.remove(0, 5);
132 QMap<QString, QString> *alsadevs =
134 if (!alsadevs->empty() && alsadevs->contains(device_name))
136 if (alsadevs->value(device_name).contains(
"pulse",
137 Qt::CaseInsensitive))
145 if (main_device.contains(
"pulse", Qt::CaseInsensitive))
154 #endif // USING_PULSE
156 if (main_device.startsWith(
"ALSA:"))
162 LOG(VB_GENERAL, LOG_ERR,
"Audio output device is set to an ALSA device "
163 "but ALSA support is not compiled in!");
166 else if (main_device.startsWith(
"JACK:"))
172 LOG(VB_GENERAL, LOG_ERR,
"Audio output device is set to a JACK device "
173 "but JACK support is not compiled in!");
176 else if (main_device.startsWith(
"DirectX:"))
181 LOG(VB_GENERAL, LOG_ERR,
"Audio output device is set to DirectX device "
182 "but DirectX support is not compiled in!");
185 else if (main_device.startsWith(
"Windows:"))
190 LOG(VB_GENERAL, LOG_ERR,
"Audio output device is set to a Windows "
191 "device but Windows support is not compiled "
195 else if (main_device.startsWith(
"OpenSLES:"))
200 LOG(VB_GENERAL, LOG_ERR,
"Audio output device is set to a OpenSLES "
201 "device but Android support is not compiled "
205 else if (main_device.startsWith(
"AudioTrack:"))
210 LOG(VB_GENERAL, LOG_ERR,
"Audio output device is set to AudioTrack "
211 "device but Android support is not compiled "
215 #if defined(USING_OSS)
220 #elif defined(Q_OS_DARWIN)
229 LOG(VB_GENERAL, LOG_CRIT,
"No useable audio output driver found.");
230 LOG(VB_GENERAL, LOG_ERR,
"Don't disable OSS support unless you're "
231 "not running on Linux.");
291 LOG(VB_GENERAL, LOG_WARNING,
"AudioOutput Warning: " +
m_lastWarn);
305 QString &name,
const QString &desc,
bool willsuspendpa)
319 QString msg = tr(
"Invalid or unuseable audio device");
323 QString capabilities = desc;
329 capabilities += tr(
" (%1 connected to %2)")
335 capabilities += tr(
" (No connection detected)");
340 switch (max_channels)
353 capabilities += tr(
"\nDevice supports up to %1")
368 (
static_cast<int>(aosettings.
canLPCM()) << 0) |
369 (
static_cast<int>(aosettings.
canAC3()) << 1) |
370 (
static_cast<int>(aosettings.
canDTS()) << 2);
371 static const std::array<const std::string,3> s_typeNames {
"LPCM",
"AC3",
"DTS" };
375 capabilities += QObject::tr(
" (guessing: ");
376 bool found_one =
false;
377 for (
unsigned int i = 0; i < 3; i++)
379 if ((mask & (1 << i)) != 0)
382 capabilities +=
", ";
383 capabilities += QString::fromStdString(s_typeNames[i]);
387 capabilities += QString(
")");
391 LOG(VB_AUDIO, LOG_INFO, QString(
"Found %1 (%2)") .arg(name, capabilities));
393 adc->m_settings = aosettings;
401 QFileInfoList entries = dir.entryInfoList();
402 for (
const auto& fi : std::as_const(entries))
404 QString name = fi.absoluteFilePath();
405 QString desc = AudioOutput::tr(
"OSS device");
427 if (!alsadevs->empty())
429 for (
auto i = alsadevs->cbegin(); i != alsadevs->cend(); ++i)
431 const QString& key = i.key();
432 const QString& desc = i.value();
433 QString devname = QString(
"ALSA:%1").arg(key);
446 QDir dev(
"/dev",
"dsp*", QDir::Name, QDir::System);
448 dev.setNameFilters(QStringList(
"adsp*"));
451 dev.setPath(
"/dev/sound");
454 dev.setNameFilters(QStringList(
"dsp*"));
456 dev.setNameFilters(QStringList(
"adsp*"));
463 QString name =
"JACK:";
464 QString desc = tr(
"Use JACK default sound server.");
479 for (QMap<QString, QString>::const_iterator i = devs->begin();
480 i != devs->end(); ++i)
482 QString key = i.key();
483 QString desc = i.value();
484 QString devname = QString(
"CoreAudio:%1").arg(key);
494 QString name =
"CoreAudio:Default Output Device";
495 QString desc = tr(
"CoreAudio default output");
506 QString name =
"Windows:";
507 QString desc =
"Windows default output";
517 if (!dxdevs->empty())
519 for (QMap<int, QString>::const_iterator i = dxdevs->begin();
520 i != dxdevs->end(); ++i)
522 QString devdesc = i.value();
523 QString devname = QString(
"DirectX:%1").arg(devdesc);
541 #ifdef USING_PULSEOUTPUT
543 QString name =
"PulseAudio:default";
544 QString desc = tr(
"PulseAudio default sound server.");
556 QString name =
"OpenSLES:";
557 QString desc = tr(
"OpenSLES default output. Stereo support only.");
566 QString name =
"AudioTrack:";
567 QString desc = tr(
"Android AudioTrack output. Supports surround sound.");
577 QString name =
"NULL";
578 QString desc =
"NULL device";
596 uint8_t *buffer,
int &data_size,
599 bool got_frame =
false;
607 return AVERROR(ENOMEM);
621 int ret = avcodec_receive_frame(ctx,
m_frame);
624 if (ret == AVERROR(EAGAIN))
627 ret = avcodec_send_packet(ctx, pkt);
628 if (ret == AVERROR(EAGAIN))
633 LOG(VB_AUDIO, LOG_ERR,
LOC +
634 QString(
"audio decode error: %1 (%2)")
646 LOG(VB_AUDIO, LOG_DEBUG,
LOC +
647 QString(
"audio decode, no frame decoded (%1)").arg(ret));
651 auto format = (AVSampleFormat)
m_frame->format;
655 data_size =
m_frame->nb_samples *
m_frame->ch_layout.nb_channels * av_get_bytes_per_sample(format);
659 uint8_t* src =
nullptr;
661 if (av_sample_fmt_is_planar(format))
666 (
const uint8_t **)
m_frame->extended_data,
672 src =
m_frame->extended_data[0];
675 uint8_t* transit = buffer;
681 transit = (uint8_t*)av_malloc(data_size * av_get_bytes_per_sample(ctx->sample_fmt)
685 LOG(VB_AUDIO, LOG_ERR,
LOC +
686 QString(
"audio decode, out of memory"));
693 data_size = converter.
Process(transit, src, data_size,
true);
695 if (transit != buffer)