32 #ifdef USING_PULSEOUTPUT
44 #include "libavcodec/avcodec.h"
49 #define LOC QString("AO: ")
59 const QString &main_device,
const QString &passthru_device,
60 AudioFormat format,
int channels, AVCodecID codec,
int samplerate,
65 main_device, passthru_device, format, channels, codec, samplerate,
66 source, set_initial_vol, passthru, upmixer_startup, custom);
72 const QString &main_device,
const QString &passthru_device,
77 return OpenAudio(settings, willsuspendpa);
81 [[maybe_unused]]
bool willsuspendpa)
88 willsuspendpa =
false;
91 bool pulsestatus =
false;
94 static bool warned =
false;
98 LOG(VB_GENERAL, LOG_WARNING,
99 "WARNING: ***Pulse Audio is running***");
102 #endif // USING_PULSE
106 if (main_device.startsWith(
"PulseAudio:"))
108 #ifdef USING_PULSEOUTPUT
111 LOG(VB_GENERAL, LOG_ERR,
"Audio output device is set to PulseAudio "
112 "but PulseAudio support is not compiled in!");
114 #endif // USING_PULSEOUTPUT
116 if (main_device.startsWith(
"NULL"))
124 bool ispulse =
false;
128 if (main_device.startsWith(
"ALSA:"))
130 QString device_name = main_device;
132 device_name.remove(0, 5);
133 QMap<QString, QString> *alsadevs =
135 if (!alsadevs->empty() && alsadevs->contains(device_name))
137 if (alsadevs->value(device_name).contains(
"pulse",
138 Qt::CaseInsensitive))
146 if (main_device.contains(
"pulse", Qt::CaseInsensitive))
155 #endif // USING_PULSE
157 if (main_device.startsWith(
"ALSA:"))
163 LOG(VB_GENERAL, LOG_ERR,
"Audio output device is set to an ALSA device "
164 "but ALSA support is not compiled in!");
167 else if (main_device.startsWith(
"JACK:"))
173 LOG(VB_GENERAL, LOG_ERR,
"Audio output device is set to a JACK device "
174 "but JACK support is not compiled in!");
177 else if (main_device.startsWith(
"DirectX:"))
182 LOG(VB_GENERAL, LOG_ERR,
"Audio output device is set to DirectX device "
183 "but DirectX support is not compiled in!");
186 else if (main_device.startsWith(
"Windows:"))
191 LOG(VB_GENERAL, LOG_ERR,
"Audio output device is set to a Windows "
192 "device but Windows support is not compiled "
196 else if (main_device.startsWith(
"OpenSLES:"))
201 LOG(VB_GENERAL, LOG_ERR,
"Audio output device is set to a OpenSLES "
202 "device but Android support is not compiled "
206 else if (main_device.startsWith(
"AudioTrack:"))
211 LOG(VB_GENERAL, LOG_ERR,
"Audio output device is set to AudioTrack "
212 "device but Android support is not compiled "
216 #if defined(USING_OSS)
221 #elif defined(Q_OS_DARWIN)
230 LOG(VB_GENERAL, LOG_CRIT,
"No useable audio output driver found.");
231 LOG(VB_GENERAL, LOG_ERR,
"Don't disable OSS support unless you're "
232 "not running on Linux.");
292 LOG(VB_GENERAL, LOG_WARNING,
"AudioOutput Warning: " +
m_lastWarn);
306 QString &name,
const QString &desc,
bool willsuspendpa)
320 QString msg = tr(
"Invalid or unuseable audio device");
324 QString capabilities = desc;
330 capabilities += tr(
" (%1 connected to %2)")
336 capabilities += tr(
" (No connection detected)");
341 switch (max_channels)
354 capabilities += tr(
"\nDevice supports up to %1")
369 (
static_cast<int>(aosettings.
canLPCM()) << 0) |
370 (
static_cast<int>(aosettings.
canAC3()) << 1) |
371 (
static_cast<int>(aosettings.
canDTS()) << 2);
372 static const std::array<const std::string,3> s_typeNames {
"LPCM",
"AC3",
"DTS" };
376 capabilities += QObject::tr(
" (guessing: ");
377 bool found_one =
false;
378 for (
unsigned int i = 0; i < 3; i++)
380 if ((mask & (1 << i)) != 0)
383 capabilities +=
", ";
384 capabilities += QString::fromStdString(s_typeNames[i]);
388 capabilities += QString(
")");
392 LOG(VB_AUDIO, LOG_INFO, QString(
"Found %1 (%2)") .arg(name, capabilities));
394 adc->m_settings = aosettings;
402 QFileInfoList entries = dir.entryInfoList();
403 for (
const auto& fi : std::as_const(entries))
405 QString name = fi.absoluteFilePath();
406 QString desc = AudioOutput::tr(
"OSS device");
428 if (!alsadevs->empty())
430 for (
auto i = alsadevs->cbegin(); i != alsadevs->cend(); ++i)
432 const QString& key = i.key();
433 const QString& desc = i.value();
434 QString devname = QString(
"ALSA:%1").arg(key);
447 QDir dev(
"/dev",
"dsp*", QDir::Name, QDir::System);
449 dev.setNameFilters(QStringList(
"adsp*"));
452 dev.setPath(
"/dev/sound");
455 dev.setNameFilters(QStringList(
"dsp*"));
457 dev.setNameFilters(QStringList(
"adsp*"));
464 QString name =
"JACK:";
465 QString desc = tr(
"Use JACK default sound server.");
480 for (QMap<QString, QString>::const_iterator i = devs->begin();
481 i != devs->end(); ++i)
483 QString key = i.key();
484 QString desc = i.value();
485 QString devname = QString(
"CoreAudio:%1").arg(key);
495 QString name =
"CoreAudio:Default Output Device";
496 QString desc = tr(
"CoreAudio default output");
507 QString name =
"Windows:";
508 QString desc =
"Windows default output";
518 if (!dxdevs->empty())
520 for (QMap<int, QString>::const_iterator i = dxdevs->begin();
521 i != dxdevs->end(); ++i)
523 QString devdesc = i.value();
524 QString devname = QString(
"DirectX:%1").arg(devdesc);
542 #ifdef USING_PULSEOUTPUT
544 QString name =
"PulseAudio:default";
545 QString desc = tr(
"PulseAudio default sound server.");
557 QString name =
"OpenSLES:";
558 QString desc = tr(
"OpenSLES default output. Stereo support only.");
567 QString name =
"AudioTrack:";
568 QString desc = tr(
"Android AudioTrack output. Supports surround sound.");
578 QString name =
"NULL";
579 QString desc =
"NULL device";
597 uint8_t *buffer,
int &data_size,
600 bool got_frame =
false;
608 return AVERROR(ENOMEM);
622 int ret = avcodec_receive_frame(ctx,
m_frame);
625 if (ret == AVERROR(EAGAIN))
628 ret = avcodec_send_packet(ctx, pkt);
629 if (ret == AVERROR(EAGAIN))
634 LOG(VB_AUDIO, LOG_ERR,
LOC +
635 QString(
"audio decode error: %1 (%2)")
647 LOG(VB_AUDIO, LOG_DEBUG,
LOC +
648 QString(
"audio decode, no frame decoded (%1)").arg(ret));
652 auto format = (AVSampleFormat)
m_frame->format;
656 data_size =
m_frame->nb_samples *
m_frame->ch_layout.nb_channels * av_get_bytes_per_sample(format);
660 uint8_t* src =
nullptr;
662 if (av_sample_fmt_is_planar(format))
667 (
const uint8_t **)
m_frame->extended_data,
673 src =
m_frame->extended_data[0];
676 uint8_t* transit = buffer;
682 transit = (uint8_t*)av_malloc(data_size * av_get_bytes_per_sample(ctx->sample_fmt)
686 LOG(VB_AUDIO, LOG_ERR,
LOC +
687 QString(
"audio decode, out of memory"));
694 data_size = converter.
Process(transit, src, data_size,
true);
696 if (transit != buffer)