From c235f09fc5ef83827ac53375015f469cd7e13eec Mon Sep 17 00:00:00 2001 From: "N.N" Date: Mon, 14 Dec 2009 19:55:54 +0000 Subject: import version 0.36 svn path=/trunk/externals/august/readanysf~/; revision=12836 --- FifoAudioFrames.cpp | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 FifoAudioFrames.cpp (limited to 'FifoAudioFrames.cpp') diff --git a/FifoAudioFrames.cpp b/FifoAudioFrames.cpp new file mode 100644 index 0000000..8209ab1 --- /dev/null +++ b/FifoAudioFrames.cpp @@ -0,0 +1,132 @@ +#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); +} +*/ + + +Fifo::Fifo(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("Fifo::size=%d\n", size); +} + +Fifo::~Fifo() { + //printf("deleting fifo \n"); + for(int i=0; i < size; i++) { + gavl_audio_frame_destroy( fifoPtr[i] ); + } + delete format; + delete[] fifoPtr; + + //printf("deleted fifo \n"); +} + +// empty the fifo of any content +void Fifo::Flush() { + pthread_mutex_lock (&mut); + start = 0 ; + end = 0 ; + count = 0; + //printf("Fifo::flushed size=%d\n", count); + pthread_mutex_unlock (&mut); +} + +// push an element onto the Fifo +bool Fifo::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 Fifo +bool Fifo::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 Fifo::Dump( char * c) { + int i,j = 0; + pthread_mutex_lock (&mut); + printf("%s -----------------------\n", c); + for( i=0;i= 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 Fifo::FreeSpace() { bool ret; pthread_mutex_lock(&mut); ret = (count < size);pthread_mutex_unlock (&mut); return ret;} +bool Fifo::isEmpty() { bool c; pthread_mutex_lock(&mut); c = (count == 0) ; pthread_mutex_unlock (&mut); return c; } +bool Fifo::isFull() { bool c; pthread_mutex_lock(&mut); c = (count == size ); pthread_mutex_unlock (&mut); return c; } +gavl_audio_format_t * Fifo::getFormat() { return format; }; +float Fifo::getSizePercentage() { float ret; pthread_mutex_lock(&mut);ret = count / (float) size; pthread_mutex_unlock (&mut); return ret;}; + -- cgit v1.2.1