mirror of
https://github.com/cookiengineer/audacity
synced 2025-06-17 16:40:07 +02:00
Revert "Possibly correct some cases of clicky playback or corrupt recording..."
This reverts commit 6dca4f785904fd870d6829dd51aa0c56803012dc.
This commit is contained in:
parent
8407ef1e6c
commit
a0bf2892fa
@ -245,12 +245,6 @@
|
|||||||
// Easy change of keystroke bindings for menu items
|
// Easy change of keystroke bindings for menu items
|
||||||
#define EXPERIMENTAL_EASY_CHANGE_KEY_BINDINGS
|
#define EXPERIMENTAL_EASY_CHANGE_KEY_BINDINGS
|
||||||
|
|
||||||
// PRL 17 Mar 2018
|
|
||||||
// Hoping to commit to use of this branch before 2.3.0 is out.
|
|
||||||
// Don't use our own RingBuffer class, but reuse PortAudio's which includes
|
|
||||||
// proper memory fences.
|
|
||||||
#define EXPERIMENTAL_REWRITE_RING_BUFFER
|
|
||||||
|
|
||||||
// PRL 1 Jun 2018
|
// PRL 1 Jun 2018
|
||||||
#define EXPERIMENTAL_PUNCH_AND_ROLL
|
#define EXPERIMENTAL_PUNCH_AND_ROLL
|
||||||
|
|
||||||
|
@ -23,45 +23,12 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "RingBuffer.h"
|
#include "RingBuffer.h"
|
||||||
#include "Experimental.h"
|
|
||||||
|
|
||||||
#undef REWRITE_RING_BUFFER
|
|
||||||
|
|
||||||
// For now enabling the rewrite only for Mac
|
|
||||||
|
|
||||||
#ifdef EXPERIMENTAL_REWRITE_RING_BUFFER
|
|
||||||
#define REWRITE_RING_BUFFER
|
|
||||||
#elif defined (__APPLE__)
|
|
||||||
#define REWRITE_RING_BUFFER
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
size_t roundUp(size_t n)
|
|
||||||
{
|
|
||||||
#ifdef REWRITE_RING_BUFFER
|
|
||||||
// PaUtilRingBuffer requires a power of 2
|
|
||||||
if (n == 0)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
size_t prev = n;
|
|
||||||
for (size_t temp = n; temp != 0; prev = temp, temp = ((temp - 1) & temp))
|
|
||||||
;
|
|
||||||
return prev == n ? prev : prev << 1;
|
|
||||||
#else
|
|
||||||
return n;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
RingBuffer::RingBuffer(sampleFormat format, size_t size)
|
RingBuffer::RingBuffer(sampleFormat format, size_t size)
|
||||||
: mFormat{ format }
|
: mFormat{ format }
|
||||||
, mBufferSize{ roundUp( std::max<size_t>(size, 64) ) }
|
, mBufferSize{ std::max<size_t>(size, 64) }
|
||||||
, mBuffer{ mBufferSize, mFormat }
|
, mBuffer{ mBufferSize, mFormat }
|
||||||
{
|
{
|
||||||
#ifdef REWRITE_RING_BUFFER
|
|
||||||
PaUtil_InitializeRingBuffer(
|
|
||||||
&mRingBuffer, SAMPLE_SIZE(format), mBufferSize, mBuffer.ptr() );
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
RingBuffer::~RingBuffer()
|
RingBuffer::~RingBuffer()
|
||||||
@ -70,11 +37,7 @@ RingBuffer::~RingBuffer()
|
|||||||
|
|
||||||
size_t RingBuffer::Len()
|
size_t RingBuffer::Len()
|
||||||
{
|
{
|
||||||
#ifdef REWRITE_RING_BUFFER
|
|
||||||
return (mEnd + mBufferSize - mStart) % mBufferSize;
|
return (mEnd + mBufferSize - mStart) % mBufferSize;
|
||||||
#else
|
|
||||||
assert(false);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -83,19 +46,12 @@ size_t RingBuffer::Len()
|
|||||||
|
|
||||||
size_t RingBuffer::AvailForPut()
|
size_t RingBuffer::AvailForPut()
|
||||||
{
|
{
|
||||||
#ifdef REWRITE_RING_BUFFER
|
|
||||||
return PaUtil_GetRingBufferWriteAvailable(&mRingBuffer);
|
|
||||||
#else
|
|
||||||
return std::max<size_t>(mBufferSize - Len(), 4) - 4;
|
return std::max<size_t>(mBufferSize - Len(), 4) - 4;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t RingBuffer::Put(samplePtr buffer, sampleFormat format,
|
size_t RingBuffer::Put(samplePtr buffer, sampleFormat format,
|
||||||
size_t samplesToCopy)
|
size_t samplesToCopy)
|
||||||
{
|
{
|
||||||
#ifdef REWRITE_RING_BUFFER
|
|
||||||
return PaUtil_WriteRingBuffer(&mRingBuffer, buffer, samplesToCopy);
|
|
||||||
#else
|
|
||||||
samplesToCopy = std::min( samplesToCopy, AvailForPut() );
|
samplesToCopy = std::min( samplesToCopy, AvailForPut() );
|
||||||
auto src = buffer;
|
auto src = buffer;
|
||||||
size_t copied = 0;
|
size_t copied = 0;
|
||||||
@ -117,11 +73,8 @@ size_t RingBuffer::Put(samplePtr buffer, sampleFormat format,
|
|||||||
mEnd = pos;
|
mEnd = pos;
|
||||||
|
|
||||||
return copied;
|
return copied;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
// not used
|
|
||||||
size_t RingBuffer::Clear(sampleFormat format, size_t samplesToClear)
|
size_t RingBuffer::Clear(sampleFormat format, size_t samplesToClear)
|
||||||
{
|
{
|
||||||
samplesToClear = std::min( samplesToClear, AvailForPut() );
|
samplesToClear = std::min( samplesToClear, AvailForPut() );
|
||||||
@ -142,7 +95,6 @@ size_t RingBuffer::Clear(sampleFormat format, size_t samplesToClear)
|
|||||||
|
|
||||||
return cleared;
|
return cleared;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// For the reader only:
|
// For the reader only:
|
||||||
@ -150,19 +102,12 @@ size_t RingBuffer::Clear(sampleFormat format, size_t samplesToClear)
|
|||||||
|
|
||||||
size_t RingBuffer::AvailForGet()
|
size_t RingBuffer::AvailForGet()
|
||||||
{
|
{
|
||||||
#ifdef REWRITE_RING_BUFFER
|
|
||||||
return PaUtil_GetRingBufferReadAvailable(&mRingBuffer);
|
|
||||||
#else
|
|
||||||
return Len();
|
return Len();
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t RingBuffer::Get(samplePtr buffer, sampleFormat format,
|
size_t RingBuffer::Get(samplePtr buffer, sampleFormat format,
|
||||||
size_t samplesToCopy)
|
size_t samplesToCopy)
|
||||||
{
|
{
|
||||||
#ifdef REWRITE_RING_BUFFER
|
|
||||||
return PaUtil_ReadRingBuffer(&mRingBuffer, buffer, samplesToCopy);
|
|
||||||
#else
|
|
||||||
samplesToCopy = std::min( samplesToCopy, Len() );
|
samplesToCopy = std::min( samplesToCopy, Len() );
|
||||||
auto dest = buffer;
|
auto dest = buffer;
|
||||||
size_t copied = 0;
|
size_t copied = 0;
|
||||||
@ -181,17 +126,13 @@ size_t RingBuffer::Get(samplePtr buffer, sampleFormat format,
|
|||||||
}
|
}
|
||||||
|
|
||||||
return copied;
|
return copied;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t RingBuffer::Discard(size_t samplesToDiscard)
|
size_t RingBuffer::Discard(size_t samplesToDiscard)
|
||||||
{
|
{
|
||||||
#ifdef REWRITE_RING_BUFFER
|
|
||||||
PaUtil_AdvanceRingBufferReadIndex(&mRingBuffer, samplesToDiscard);
|
|
||||||
#else
|
|
||||||
samplesToDiscard = std::min( samplesToDiscard, Len() );
|
samplesToDiscard = std::min( samplesToDiscard, Len() );
|
||||||
|
|
||||||
mStart = (mStart + samplesToDiscard) % mBufferSize;
|
mStart = (mStart + samplesToDiscard) % mBufferSize;
|
||||||
#endif
|
|
||||||
return samplesToDiscard;
|
return samplesToDiscard;
|
||||||
}
|
}
|
||||||
|
@ -13,8 +13,6 @@
|
|||||||
|
|
||||||
#include "SampleFormat.h"
|
#include "SampleFormat.h"
|
||||||
|
|
||||||
#include "../lib-src/portaudio-v19/src/common/pa_ringbuffer.h"
|
|
||||||
|
|
||||||
class RingBuffer {
|
class RingBuffer {
|
||||||
public:
|
public:
|
||||||
RingBuffer(sampleFormat format, size_t size);
|
RingBuffer(sampleFormat format, size_t size);
|
||||||
@ -26,7 +24,7 @@ class RingBuffer {
|
|||||||
|
|
||||||
size_t AvailForPut();
|
size_t AvailForPut();
|
||||||
size_t Put(samplePtr buffer, sampleFormat format, size_t samples);
|
size_t Put(samplePtr buffer, sampleFormat format, size_t samples);
|
||||||
// size_t Clear(sampleFormat format, size_t samples);
|
size_t Clear(sampleFormat format, size_t samples);
|
||||||
|
|
||||||
//
|
//
|
||||||
// For the reader only:
|
// For the reader only:
|
||||||
@ -44,8 +42,6 @@ class RingBuffer {
|
|||||||
size_t mEnd { 0 };
|
size_t mEnd { 0 };
|
||||||
size_t mBufferSize;
|
size_t mBufferSize;
|
||||||
SampleBuffer mBuffer;
|
SampleBuffer mBuffer;
|
||||||
|
|
||||||
PaUtilRingBuffer mRingBuffer;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* __AUDACITY_RING_BUFFER__ */
|
#endif /* __AUDACITY_RING_BUFFER__ */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user