* property size */
int b_alive = false;
+ bool b_start_digital = false;
+
p_sys = p_aout->sys;
p_sys->b_digital = false;
p_sys->au_component = NULL;
aout_FormatPrint(p_aout, "VLC is looking for:", fmt);
- if (p_sys->b_selected_dev_is_digital)
- msg_Dbg(p_aout, "audio device supports digital output");
-
msg_Dbg(p_aout, "attempting to use device %i", p_sys->i_selected_dev);
/* Check if the desired device is alive and usable */
}
if (!b_alive) {
- msg_Warn(p_aout, "selected audio device is not alive, switching to default device");
+ msg_Warn(p_aout, "selected audio device is not alive, switching to default device with id %i", p_sys->i_default_dev);
p_sys->i_selected_dev = p_sys->i_default_dev;
+ p_sys->b_selected_dev_is_digital = false;
}
+ // recheck if device still supports digital
+ b_start_digital = p_sys->b_selected_dev_is_digital;
+ if(!AudioDeviceSupportsDigital(p_aout, p_sys->i_selected_dev))
+ b_start_digital = false;
+
+ if (b_start_digital)
+ msg_Dbg(p_aout, "Use audio device for digital output");
+
/* add a callback to see if the device dies later on */
err = AudioObjectAddPropertyListener(p_sys->i_selected_dev, &audioDeviceAliveAddress, HardwareListener, (void *)p_aout);
if (err != noErr) {
bool b_success = false;
/* Check for Digital mode or Analog output mode */
- if (AOUT_FMT_SPDIF (fmt) && p_sys->b_selected_dev_is_digital) {
+ if (AOUT_FMT_SPDIF (fmt) && b_start_digital) {
if (StartSPDIF (p_aout, fmt)) {
msg_Dbg(p_aout, "digital output successfully opened");
b_success = true;
}
/* move data to buffer */
- TPCircularBufferProduceBytes(&p_sys->circular_buffer, p_block->p_buffer, p_block->i_buffer);
+ if (unlikely(!TPCircularBufferProduceBytes(&p_sys->circular_buffer, p_block->p_buffer, p_block->i_buffer)))
+ msg_Warn(p_aout, "dropped buffer");
if (!p_sys->i_bytes_per_sample)
p_sys->i_bytes_per_sample = p_block->i_buffer / p_block->i_nb_samples;
if (wait) {
int32_t availableBytes;
vlc_mutex_lock(&p_sys->lock);
- while (TPCircularBufferTail(&p_sys->circular_buffer, &availableBytes) != NULL) {
+ TPCircularBufferTail(&p_sys->circular_buffer, &availableBytes);
+ while (availableBytes > 0) {
vlc_cond_wait(&p_sys->cond, &p_sys->lock);
+ TPCircularBufferTail(&p_sys->circular_buffer, &availableBytes);
}
vlc_mutex_unlock(&p_sys->lock);
int bytesToCopy = ioData->mBuffers[0].mDataByteSize;
Float32 *targetBuffer = (Float32*)ioData->mBuffers[0].mData;
+ vlc_mutex_lock(&p_sys->lock);
/* Pull audio from buffer */
int32_t availableBytes;
Float32 *buffer = TPCircularBufferTail(&p_sys->circular_buffer, &availableBytes);
TPCircularBufferConsume(&p_sys->circular_buffer, __MIN(bytesToCopy, availableBytes));
}
- vlc_mutex_lock(&p_sys->lock);
vlc_cond_signal(&p_sys->cond);
vlc_mutex_unlock(&p_sys->lock);
int bytesToCopy = outOutputData->mBuffers[p_sys->i_stream_index].mDataByteSize;
char *targetBuffer = outOutputData->mBuffers[p_sys->i_stream_index].mData;
+ vlc_mutex_lock(&p_sys->lock);
/* Pull audio from buffer */
int32_t availableBytes;
char *buffer = TPCircularBufferTail(&p_sys->circular_buffer, &availableBytes);
TPCircularBufferConsume(&p_sys->circular_buffer, __MIN(bytesToCopy, availableBytes));
}
- vlc_mutex_lock(&p_sys->lock);
vlc_cond_signal(&p_sys->cond);
vlc_mutex_unlock(&p_sys->lock);