T Dequeue() { // it returns false if there is nothing to deque.
		while (1) {
			const Node* const first = m_Head;
			const Node* const last = m_Tail;
			const Node* const next = first->m_Next;

			if (first != m_Head) { continue; }

			if (first == last) {
				if (next == nullptr) {
					while (m_Head->m_Next == nullptr) {
						usleep(1);
					}
					continue;
					//return false;
				}
				compare_and_set(&m_Tail, last, next);
			}
			else {
				T result = next->mValue;
				if (compare_and_set(&m_Head, first, next)) {
					delete first;
					return result;
				}
			}
		}
	}
	void Enqueue(const T& v) {
		const Node* const node = new Node(v);
		while (1) {
			const Node* const last = m_Tail;
			const Node* const next = last->m_Next;
			if (last != m_Tail) { continue; }
			if (next == nullptr) {
				if (compare_and_set(&last->m_Next, next, node)) {
					compare_and_set(&m_Tail, last, node);
					++m_Size;
					return;
				}
			}
			else {
				compare_and_set(&m_Tail, last, next);
			}
		}
	}
Exemple #3
0
void AudioRenderer::SetMillisecondsPerPixel(const double new_pixel_ms)
{
	if (compare_and_set(pixel_ms, new_pixel_ms))
	{
		if (renderer)
			renderer->SetMillisecondsPerPixel(pixel_ms);

		ResetBlockCount();
	}
}
Exemple #4
0
void AudioRenderer::SetAmplitudeScale(const float _amplitude_scale)
{
	if (compare_and_set(amplitude_scale, _amplitude_scale))
	{
		// A scaling of 0 or a negative scaling makes no sense
		assert(amplitude_scale > 0);
		if (renderer)
			renderer->SetAmplitudeScale(amplitude_scale);
		Invalidate();
	}
}
Exemple #5
0
void AudioRenderer::SetAudioProvider(agi::AudioProvider *const _provider)
{
	if (compare_and_set(provider, _provider))
	{
		Invalidate();

		if (renderer)
			renderer->SetProvider(provider);

		ResetBlockCount();
	}
}
	bool DequeueAndDelete() { // it destroys dequed item. but fast.
		while (1) {
			const Node* const first = m_Head;
			const Node* const last = m_Tail;
			const Node* const next = first->m_Next;

			if (first != m_Head) { continue; }

			if (first == last) {
				if (next == nullptr) {
					return false;
				}
				compare_and_set(&m_Tail, last, next);
			}
			else {
				if (compare_and_set(&m_Head, first, next)) {
					delete first;
					return true;
				}
			}
		}
	}
Exemple #7
0
void AudioRenderer::SetRenderer(AudioRendererBitmapProvider *const _renderer)
{
	if (compare_and_set(renderer, _renderer))
	{
		Invalidate();

		if (renderer)
		{
			renderer->SetProvider(provider);
			renderer->SetAmplitudeScale(amplitude_scale);
			renderer->SetMillisecondsPerPixel(pixel_ms);
		}
	}
}
Exemple #8
0
void AudioRenderer::SetHeight(const int _pixel_height)
{
	if (compare_and_set(pixel_height, _pixel_height))
		Invalidate();
}
Exemple #9
0
void AudioRendererBitmapProvider::SetAmplitudeScale(const float _amplitude_scale)
{
	if (compare_and_set(amplitude_scale, _amplitude_scale))
		OnSetAmplitudeScale();
}
Exemple #10
0
void AudioRendererBitmapProvider::SetMillisecondsPerPixel(const double new_pixel_ms)
{
	if (compare_and_set(pixel_ms, new_pixel_ms))
		OnSetMillisecondsPerPixel();
}
Exemple #11
0
void AudioRendererBitmapProvider::SetProvider(agi::AudioProvider *const _provider)
{
	if (compare_and_set(provider, _provider))
		OnSetProvider();
}