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.
tdemultimedia/mpeglib/lib/output/audioDataArray.cpp

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();
}