mirror of https://github.com/mpv-player/mpv
ao_coreaudio: rewrite spdif render callback
This commit is contained in:
parent
d427b4fd1c
commit
8cf36cf950
|
@ -114,6 +114,25 @@ static OSStatus render_cb_lpcm(void *ctx, AudioUnitRenderActionFlags *aflags,
|
||||||
return noErr;
|
return noErr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static OSStatus render_cb_digital(
|
||||||
|
AudioDeviceID device, const AudioTimeStamp *ts,
|
||||||
|
const void *in_data, const AudioTimeStamp *in_ts,
|
||||||
|
AudioBufferList *out_data, const AudioTimeStamp *out_ts, void *ctx)
|
||||||
|
{
|
||||||
|
struct ao *ao = ctx;
|
||||||
|
struct priv *p = ao->priv;
|
||||||
|
AudioBuffer buf = out_data->mBuffers[p->i_stream_index];
|
||||||
|
int requested = buf.mDataByteSize;
|
||||||
|
|
||||||
|
if (p->b_muted) {
|
||||||
|
mp_ring_drain(p->buffer, requested);
|
||||||
|
} else {
|
||||||
|
buf.mDataByteSize = mp_ring_read(p->buffer, buf.mData, requested);
|
||||||
|
}
|
||||||
|
|
||||||
|
return noErr;
|
||||||
|
}
|
||||||
|
|
||||||
static int control(struct ao *ao, enum aocontrol cmd, void *arg)
|
static int control(struct ao *ao, enum aocontrol cmd, void *arg)
|
||||||
{
|
{
|
||||||
struct priv *p = ao->priv;
|
struct priv *p = ao->priv;
|
||||||
|
@ -321,13 +340,6 @@ static int AudioStreamSupportsDigital(AudioStreamID i_stream_id);
|
||||||
static int OpenSPDIF(struct ao *ao);
|
static int OpenSPDIF(struct ao *ao);
|
||||||
static int AudioStreamChangeFormat(AudioStreamID i_stream_id,
|
static int AudioStreamChangeFormat(AudioStreamID i_stream_id,
|
||||||
AudioStreamBasicDescription change_format);
|
AudioStreamBasicDescription change_format);
|
||||||
static OSStatus RenderCallbackSPDIF(AudioDeviceID inDevice,
|
|
||||||
const AudioTimeStamp *inNow,
|
|
||||||
const void *inInputData,
|
|
||||||
const AudioTimeStamp *inInputTime,
|
|
||||||
AudioBufferList *outOutputData,
|
|
||||||
const AudioTimeStamp *inOutputTime,
|
|
||||||
void *threadGlobals);
|
|
||||||
static OSStatus StreamListener(AudioObjectID inObjectID,
|
static OSStatus StreamListener(AudioObjectID inObjectID,
|
||||||
UInt32 inNumberAddresses,
|
UInt32 inNumberAddresses,
|
||||||
const AudioObjectPropertyAddress inAddresses[],
|
const AudioObjectPropertyAddress inAddresses[],
|
||||||
|
@ -851,7 +863,7 @@ static int OpenSPDIF(struct ao *ao)
|
||||||
|
|
||||||
/* Create IOProc callback. */
|
/* Create IOProc callback. */
|
||||||
err = AudioDeviceCreateIOProcID(p->i_selected_dev,
|
err = AudioDeviceCreateIOProcID(p->i_selected_dev,
|
||||||
(AudioDeviceIOProc)RenderCallbackSPDIF,
|
(AudioDeviceIOProc)render_cb_digital,
|
||||||
(void *)ao,
|
(void *)ao,
|
||||||
&p->renderCallback);
|
&p->renderCallback);
|
||||||
|
|
||||||
|
@ -1043,37 +1055,6 @@ static int AudioStreamChangeFormat(AudioStreamID i_stream_id,
|
||||||
return CONTROL_TRUE;
|
return CONTROL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
* RenderCallbackSPDIF: callback for SPDIF audio output
|
|
||||||
*****************************************************************************/
|
|
||||||
static OSStatus RenderCallbackSPDIF(AudioDeviceID inDevice,
|
|
||||||
const AudioTimeStamp *inNow,
|
|
||||||
const void *inInputData,
|
|
||||||
const AudioTimeStamp *inInputTime,
|
|
||||||
AudioBufferList *outOutputData,
|
|
||||||
const AudioTimeStamp *inOutputTime,
|
|
||||||
void *threadGlobals)
|
|
||||||
{
|
|
||||||
struct ao *ao = threadGlobals;
|
|
||||||
struct priv *p = ao->priv;
|
|
||||||
int amt = mp_ring_buffered(p->buffer);
|
|
||||||
AudioBuffer ca_buffer = outOutputData->mBuffers[p->i_stream_index];
|
|
||||||
int req = ca_buffer.mDataByteSize;
|
|
||||||
|
|
||||||
if (amt > req)
|
|
||||||
amt = req;
|
|
||||||
if (amt) {
|
|
||||||
if (p->b_muted) {
|
|
||||||
mp_ring_read(p->buffer, NULL, amt);
|
|
||||||
} else {
|
|
||||||
mp_ring_read(p->buffer, (unsigned char *)ca_buffer.mData, amt);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return noErr;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int play(struct ao *ao, void *output_samples, int num_bytes, int flags)
|
static int play(struct ao *ao, void *output_samples, int num_bytes, int flags)
|
||||||
{
|
{
|
||||||
struct priv *p = ao->priv;
|
struct priv *p = ao->priv;
|
||||||
|
|
Loading…
Reference in New Issue