aboutsummaryrefslogtreecommitdiff
path: root/src/FifoAudioFrames.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/FifoAudioFrames.cpp')
-rw-r--r--src/FifoAudioFrames.cpp140
1 files changed, 140 insertions, 0 deletions
diff --git a/src/FifoAudioFrames.cpp b/src/FifoAudioFrames.cpp
new file mode 100644
index 0000000..a3bc682
--- /dev/null
+++ b/src/FifoAudioFrames.cpp
@@ -0,0 +1,140 @@
+#include "FifoAudioFrames.h"
+
+/*
+#define RESET 0
+#define BRIGHT 1
+#define DIM 2
+#define UNDERLINE 3
+#define BLINK 4
+#define REVERSE 7
+#define HIDDEN 8
+
+#define BLACK 0
+#define RED 1
+#define GREEN 2
+#define YELLOW 3
+#define BLUE 4
+#define MAGENTA 5
+#define CYAN 6
+#define WHITE 7
+void textcolor(int attr, int fg, int bg) {
+ char command[13];
+ // Command is the control command to the terminal
+ sprintf(command, "%c[%d;%d;%dm", 0x1B, attr, fg + 30, bg + 40);
+ printf("%s", command);
+}
+*/
+
+
+FifoAudioFrames::FifoAudioFrames(int s, gavl_audio_format_t * f) {
+ size = s ;
+ start = 0 ;
+ end = 0 ;
+ count = 0;
+ format = new gavl_audio_format_t;
+ gavl_audio_format_copy(format, f);
+ fifoPtr = new gavl_audio_frame_t * [size] ;
+ for(int i=0; i < size; i++) {
+ fifoPtr[i] = gavl_audio_frame_create( format );
+ }
+ pthread_mutex_init (&mut, 0);
+ //printf("FifoAudioFrames::size=%d\n", size);
+}
+
+FifoAudioFrames::~FifoAudioFrames() {
+ //printf("deleting fifo \n");
+ for(int i=0; i < size; i++) {
+ gavl_audio_frame_destroy( fifoPtr[i] );
+ }
+ delete format;
+ delete[] fifoPtr;
+
+ pthread_mutex_destroy (&mut);
+ //printf("deleted fifo \n");
+}
+
+// empty the fifo of any content
+void FifoAudioFrames::Flush() {
+ pthread_mutex_lock (&mut);
+ start = 0 ;
+ end = 0 ;
+ count = 0;
+ //printf("FifoAudioFrames::flushed size=%d\n", count);
+ pthread_mutex_unlock (&mut);
+}
+
+// push an element onto the FifoAudioFrames
+bool FifoAudioFrames::Append( gavl_audio_frame_t * source) {
+ bool ret = false;
+ //Dump("Appending a frame ");
+ pthread_mutex_lock (&mut);
+ if ( count < size ) { // if there is room for one more
+ int vs = gavl_audio_frame_copy(format, fifoPtr[end], source, 0,0, format->samples_per_frame, format->samples_per_frame) ;
+ fifoPtr[end]->timestamp = source->timestamp;
+ fifoPtr[end]->valid_samples =vs;
+ if (++end >= size)
+ end = 0;
+ count++;
+ ret = true;
+ } // no room in fifo, return false
+ pthread_mutex_unlock (&mut);
+ //Dump("Appended a frame ");
+ return ret;
+}
+
+// get an element off the FifoAudioFrames
+bool FifoAudioFrames::Get( gavl_audio_frame_t * dest) {
+ bool ret = false;
+ //Dump("Getting a frame ");
+ pthread_mutex_lock (&mut);
+ if ( count > 0 ) { // if there any items in the fifo
+ int vs = gavl_audio_frame_copy(format, dest, fifoPtr[start], 0, 0, format->samples_per_frame, format->samples_per_frame) ;
+ dest->timestamp = fifoPtr[start]->timestamp;
+ dest->valid_samples = vs;
+ if ( ++start >= size )
+ start = 0;
+ count--;
+ ret = true;
+ }
+ pthread_mutex_unlock (&mut);
+ //Dump("Got a frame ");
+ return ret;
+}
+/*
+void FifoAudioFrames::Dump( char * c) {
+ int i,j = 0;
+ pthread_mutex_lock (&mut);
+ printf("%s -----------------------\n", c);
+ for( i=0;i<size;i++) {
+ //j=start+i;
+ //if (j >= size)
+ // j = j -size;
+ j=i;
+ if ( j == start)
+ textcolor(BRIGHT, GREEN, BLACK);
+ if (j == end)
+ textcolor(BRIGHT, RED, BLACK);
+ if (j == end && j == start)
+ textcolor(BRIGHT, YELLOW, BLACK);
+ printf("[%d]=%ld ", j, fifoPtr[j]->timestamp);
+ textcolor(RESET, BLACK, WHITE);
+ }
+ printf("\n");
+ printf("start=%02d, end=%02d, count=%02d\n", start,end,count);
+ printf("-----------------------\n");
+ pthread_mutex_unlock (&mut);
+}
+*/
+bool FifoAudioFrames::FreeSpace() {
+ bool ret = false;
+ //printf("asking for free space on audio fifo\n");
+ pthread_mutex_lock(&mut);
+ ret = (count < size);
+ pthread_mutex_unlock (&mut);
+ return ret;
+}
+bool FifoAudioFrames::isEmpty() { bool c; pthread_mutex_lock(&mut); c = (count == 0) ; pthread_mutex_unlock (&mut); return c; }
+bool FifoAudioFrames::isFull() { bool c; pthread_mutex_lock(&mut); c = (count == size ); pthread_mutex_unlock (&mut); return c; }
+gavl_audio_format_t * FifoAudioFrames::getFormat() { return format; };
+float FifoAudioFrames::getSizePercentage() { float ret; pthread_mutex_lock(&mut);ret = count / (float) size; pthread_mutex_unlock (&mut); return ret;};
+