0015-AudioUnit-adapt-7fec79d9.patch 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. From db184a04f5130d6d6fbd8ad801c72b0a9eb39318 Mon Sep 17 00:00:00 2001
  2. From: =?UTF-8?q?Felix=20Paul=20K=C3=BChne?= <fkuehne@videolan.org>
  3. Date: Thu, 28 Mar 2013 12:43:29 +0100
  4. Subject: [PATCH 2/2] AudioUnit: adapt 7fec79d9
  5. ---
  6. modules/audio_output/audiounit_ios.c | 52 +++++++++++++-----------------------
  7. 1 file changed, 18 insertions(+), 34 deletions(-)
  8. diff --git a/modules/audio_output/audiounit_ios.c b/modules/audio_output/audiounit_ios.c
  9. index 4763cb7..6574ea9 100644
  10. --- a/modules/audio_output/audiounit_ios.c
  11. +++ b/modules/audio_output/audiounit_ios.c
  12. @@ -48,7 +48,7 @@
  13. (unsigned int)sfm.mFramesPerPacket, (unsigned int)sfm.mBytesPerFrame, \
  14. (unsigned int)sfm.mChannelsPerFrame, (unsigned int)sfm.mBitsPerChannel
  15. -#define kBufferLength 2048 * 8 * 8 * 4
  16. +#define AUDIO_BUFFER_SIZE_IN_SECONDS (AOUT_MAX_ADVANCE_TIME / CLOCK_FREQ)
  17. /*****************************************************************************
  18. * aout_sys_t: private audio output method descriptor
  19. @@ -69,9 +69,7 @@ struct aout_sys_t
  20. AudioUnit au_unit; /* The AudioUnit we use */
  21. int i_rate; /* media sample rate */
  22. - mtime_t i_played_length; /* how much did we play already */
  23. - mtime_t i_last_sample_time; /* last sample time played by the AudioUnit */
  24. - mtime_t i_first_time_stamp;
  25. + int i_bytes_per_sample;
  26. bool b_got_first_sample;
  27. vlc_mutex_t lock;
  28. @@ -138,6 +136,7 @@ static int Start(audio_output_t *p_aout, audio_sample_format_t *restrict fmt)
  29. p_sys = p_aout->sys;
  30. p_sys->au_component = NULL;
  31. p_sys->au_unit = NULL;
  32. + p_sys->i_bytes_per_sample = 0;
  33. aout_FormatPrint(p_aout, "VLC is looking for:", fmt);
  34. @@ -270,12 +269,9 @@ static int StartAnalog(audio_output_t *p_aout, audio_sample_format_t *fmt)
  35. AudioSessionSetActive(true);
  36. /* setup circular buffer */
  37. - TPCircularBufferInit(&p_sys->circular_buffer, kBufferLength);
  38. + TPCircularBufferInit(&p_sys->circular_buffer, AUDIO_BUFFER_SIZE_IN_SECONDS * fmt->i_rate * fmt->i_bytes_per_frame);
  39. p_sys->b_got_first_sample = false;
  40. - p_sys->i_played_length = 0;
  41. - p_sys->i_last_sample_time = 0;
  42. - p_sys->i_first_time_stamp = 0;
  43. return true;
  44. }
  45. @@ -296,10 +292,7 @@ static void Stop(audio_output_t *p_aout)
  46. if (status != noErr)
  47. msg_Warn(p_aout, "failed to dispose Audio Component instance (%li)", status);
  48. }
  49. -
  50. - p_sys->i_played_length = 0;
  51. - p_sys->i_last_sample_time = 0;
  52. - p_sys->i_first_time_stamp = 0;
  53. + p_sys->i_bytes_per_sample = 0;
  54. /* clean-up circular buffer */
  55. TPCircularBufferCleanup(&p_sys->circular_buffer);
  56. @@ -329,11 +322,12 @@ static void Play (audio_output_t * p_aout, block_t * p_block)
  57. VLC_CODEC_FL32);
  58. }
  59. - /* keep track of the played data */
  60. - p_aout->sys->i_played_length += p_block->i_length;
  61. -
  62. /* move data to buffer */
  63. - TPCircularBufferProduceBytes(&p_sys->circular_buffer, p_block->p_buffer, p_block->i_buffer);
  64. + if (unlikely(TPCircularBufferProduceBytes(&p_sys->circular_buffer, p_block->p_buffer, p_block->i_buffer)))
  65. + msg_Warn(p_aout, "Audio buffer was dropped");
  66. +
  67. + if (!p_sys->i_bytes_per_sample)
  68. + p_sys->i_bytes_per_sample = p_block->i_buffer / p_block->i_nb_samples;
  69. }
  70. block_Release(p_block);
  71. @@ -363,26 +357,21 @@ static void Flush(audio_output_t *p_aout, bool wait)
  72. /* flush circular buffer */
  73. AudioOutputUnitStop(p_aout->sys->au_unit);
  74. TPCircularBufferClear(&p_aout->sys->circular_buffer);
  75. -
  76. - p_sys->i_played_length = 0;
  77. - p_sys->i_last_sample_time = 0;
  78. - p_sys->i_first_time_stamp = 0;
  79. }
  80. static int TimeGet(audio_output_t *p_aout, mtime_t *delay)
  81. {
  82. struct aout_sys_t * p_sys = p_aout->sys;
  83. - vlc_mutex_lock(&p_sys->lock);
  84. - mtime_t i_pos = (p_sys->i_last_sample_time - p_sys->i_first_time_stamp) * CLOCK_FREQ / p_sys->i_rate;
  85. - vlc_mutex_unlock(&p_sys->lock);
  86. -
  87. - if (i_pos > 0) {
  88. - *delay = p_aout->sys->i_played_length - i_pos;
  89. - return 0;
  90. - }
  91. - else
  92. + if (!p_sys->i_bytes_per_sample)
  93. return -1;
  94. +
  95. + int32_t availableBytes;
  96. + TPCircularBufferTail(&p_sys->circular_buffer, &availableBytes);
  97. +
  98. + *delay = (availableBytes / p_sys->i_bytes_per_sample) * CLOCK_FREQ / p_sys->i_rate;
  99. +
  100. + return 0;
  101. }
  102. /*****************************************************************************
  103. @@ -420,11 +409,6 @@ static OSStatus RenderCallback(vlc_object_t *p_obj,
  104. memcpy(targetBuffer, buffer, __MIN(bytesToCopy, availableBytes));
  105. TPCircularBufferConsume(&p_sys->circular_buffer, __MIN(bytesToCopy, availableBytes));
  106. VLC_UNUSED(inNumberFrames);
  107. - vlc_mutex_lock(&p_sys->lock);
  108. - p_sys->i_last_sample_time = inTimeStamp->mSampleTime;
  109. - vlc_mutex_unlock(&p_sys->lock);
  110. - if (p_sys->i_first_time_stamp == 0)
  111. - p_sys->i_first_time_stamp = inTimeStamp->mSampleTime;
  112. }
  113. return noErr;
  114. --
  115. 1.7.12.4 (Apple Git-37)