You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
2.2 KiB
139 lines
2.2 KiB
/*
|
|
fifo for audioData
|
|
Copyright (C) 1999 Martin Vogt
|
|
|
|
This program 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.
|
|
|
|
For more information look at the file COPYRIGHT in this package
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "audioDataArray.h"
|
|
|
|
#include <iostream>
|
|
|
|
using namespace std;
|
|
|
|
|
|
AudioDataArray::AudioDataArray(int entries) {
|
|
|
|
this->entries=entries;
|
|
fillgrade=0;
|
|
readPos=0;
|
|
writePos=0;
|
|
pcmSum=0;
|
|
abs_thread_mutex_init(&writeInMut);
|
|
abs_thread_mutex_init(&changeMut);
|
|
|
|
audioDataArray=new AudioData*[entries];
|
|
|
|
int i;
|
|
for(i=0;i<entries;i++) {
|
|
audioDataArray[i]=new AudioData();
|
|
}
|
|
|
|
abs_thread_mutex_init(&writeInMut);
|
|
abs_thread_mutex_init(&changeMut);
|
|
|
|
}
|
|
|
|
AudioDataArray::~AudioDataArray() {
|
|
|
|
int i;
|
|
for(i=0;i<entries;i++) {
|
|
delete audioDataArray[i];
|
|
}
|
|
|
|
delete audioDataArray;
|
|
|
|
abs_thread_mutex_destroy(&writeInMut);
|
|
abs_thread_mutex_destroy(&changeMut);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AudioDataArray::lockStampArray() {
|
|
|
|
abs_thread_mutex_lock(&changeMut);
|
|
abs_thread_mutex_lock(&writeInMut);
|
|
abs_thread_mutex_unlock(&changeMut);
|
|
|
|
}
|
|
|
|
|
|
void AudioDataArray::unlockStampArray() {
|
|
abs_thread_mutex_unlock(&writeInMut);
|
|
}
|
|
|
|
|
|
void AudioDataArray::internalForward() {
|
|
pcmSum=pcmSum-readAudioData()->getPCMLen();
|
|
readPos++;
|
|
fillgrade--;
|
|
if (readPos == entries-1) {
|
|
readPos=0;
|
|
}
|
|
}
|
|
|
|
int AudioDataArray::getPCMSum() {
|
|
return pcmSum;
|
|
}
|
|
|
|
|
|
|
|
int AudioDataArray::insertAudioData(AudioData* src) {
|
|
lockStampArray();
|
|
|
|
int back=true;
|
|
src->copyTo(audioDataArray[writePos]);
|
|
pcmSum+=src->getPCMLen();
|
|
|
|
writePos++;
|
|
fillgrade++;
|
|
if (writePos == entries-1) {
|
|
writePos=0;
|
|
}
|
|
if (fillgrade == entries) {
|
|
cout <<" Audiodata::array overfull forward"<<endl;
|
|
internalForward();
|
|
back=false;
|
|
}
|
|
unlockStampArray();
|
|
return back;
|
|
}
|
|
|
|
|
|
AudioData* AudioDataArray::readAudioData() {
|
|
return audioDataArray[readPos];
|
|
}
|
|
|
|
|
|
int AudioDataArray::getFillgrade() {
|
|
return fillgrade;
|
|
}
|
|
|
|
|
|
void AudioDataArray::forward() {
|
|
lockStampArray();
|
|
internalForward();
|
|
unlockStampArray();
|
|
}
|
|
|
|
|
|
void AudioDataArray::clear() {
|
|
lockStampArray();
|
|
fillgrade=0;
|
|
readPos=0;
|
|
writePos=0;
|
|
pcmSum=0;
|
|
unlockStampArray();
|
|
}
|
|
|
|
|