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); } } }
void AudioRenderer::SetMillisecondsPerPixel(const double new_pixel_ms) { if (compare_and_set(pixel_ms, new_pixel_ms)) { if (renderer) renderer->SetMillisecondsPerPixel(pixel_ms); ResetBlockCount(); } }
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(); } }
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; } } } }
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); } } }
void AudioRenderer::SetHeight(const int _pixel_height) { if (compare_and_set(pixel_height, _pixel_height)) Invalidate(); }
void AudioRendererBitmapProvider::SetAmplitudeScale(const float _amplitude_scale) { if (compare_and_set(amplitude_scale, _amplitude_scale)) OnSetAmplitudeScale(); }
void AudioRendererBitmapProvider::SetMillisecondsPerPixel(const double new_pixel_ms) { if (compare_and_set(pixel_ms, new_pixel_ms)) OnSetMillisecondsPerPixel(); }
void AudioRendererBitmapProvider::SetProvider(agi::AudioProvider *const _provider) { if (compare_and_set(provider, _provider)) OnSetProvider(); }