mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-22 08:17:01 +00:00
8ca40fa86f
Fixes stuttering audio when iOS AU is resampling. To make AU resample, one has to request a rate that differs from AVAudioSession's sampleRate. The resampling itself is not the culprit, but rather our API misuse. AudioUnitRender modifies the mDataByteSize members with the actual read bytes count. Therefore, they must be reinitialized before each AudioUnitRender. (The buffers themselves can be preallocated.) The "stutter" was caused by one AudioUnitRender making the buffer too small for other AudioUnitRender invocations, making them fail with -50 (paramErr). By way of luck, when AU didn't resample, all AudioUnitRender invocations read the same number of bytes. (This patch addresses some non-interleaved audio concerns, but at this moment the elements do not support non-interleaved audio and non-interleaved is untested.) https://bugzilla.gnome.org/show_bug.cgi?id=744922
65 lines
2.9 KiB
C
65 lines
2.9 KiB
C
/*
|
|
* GStreamer
|
|
* Copyright (C) 2012-2013 Fluendo S.A. <support@fluendo.com>
|
|
* Authors: Josep Torra Vallès <josep@fluendo.com>
|
|
* Andoni Morales Alastruey <amorales@fluendo.com>
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Library General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Library General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Library General Public
|
|
* License along with this library; if not, write to the
|
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
* Boston, MA 02111-1307, USA.
|
|
*
|
|
*/
|
|
|
|
#include "gstosxcoreaudio.h"
|
|
#include <gst/audio/audio-channels.h>
|
|
|
|
typedef struct
|
|
{
|
|
GMutex lock;
|
|
GCond cond;
|
|
} PropertyMutex;
|
|
|
|
gboolean gst_core_audio_bind_device (GstCoreAudio *core_audio);
|
|
|
|
void gst_core_audio_dump_channel_layout (AudioChannelLayout * channel_layout);
|
|
|
|
void gst_core_audio_remove_render_callback (GstCoreAudio * core_audio);
|
|
|
|
gboolean gst_core_audio_io_proc_start (GstCoreAudio * core_audio);
|
|
|
|
gboolean gst_core_audio_io_proc_stop (GstCoreAudio * core_audio);
|
|
|
|
AudioBufferList * buffer_list_alloc (UInt32 channels, UInt32 size, gboolean interleaved);
|
|
|
|
void buffer_list_free (AudioBufferList * list);
|
|
|
|
gboolean gst_core_audio_set_format (GstCoreAudio * core_audio,
|
|
AudioStreamBasicDescription format);
|
|
|
|
gboolean gst_core_audio_set_channels_layout (GstCoreAudio * core_audio,
|
|
gint channels, GstCaps * caps);
|
|
|
|
gboolean gst_core_audio_open_device (GstCoreAudio *core_audio,
|
|
OSType sub_type,
|
|
const gchar *adesc);
|
|
|
|
OSStatus gst_core_audio_render_notify (GstCoreAudio * core_audio,
|
|
AudioUnitRenderActionFlags * ioActionFlags,
|
|
const AudioTimeStamp * inTimeStamp,
|
|
unsigned int inBusNumber,
|
|
unsigned int inNumberFrames,
|
|
AudioBufferList * ioData);
|
|
|
|
AudioChannelLabel gst_audio_channel_position_to_coreaudio_channel_label (GstAudioChannelPosition position, int channel);
|
|
|