commit b5e3ac99f4fd7b29d14adc6f0ddacead0fb2b75e
parent be6389ad95bda3c412f30adf2772b4ae93992169
Author: fundamental <mark.d.mccurry@gmail.com>
Date: Tue, 29 Dec 2009 17:10:56 -0500
Nio: Exposing buffering of Outputs
Diffstat:
4 files changed, 50 insertions(+), 6 deletions(-)
diff --git a/src/Nio/AudioOut.cpp b/src/Nio/AudioOut.cpp
@@ -27,7 +27,7 @@ using namespace std;
AudioOut::AudioOut(OutMgr *out)
:samplerate(SAMPLE_RATE),bufferSize(SOUND_BUFFER_SIZE),
- usePartial(false),manager(out),enabled(false)
+ usePartial(false),buffering(6),manager(out),enabled(false)
{
pthread_mutex_init(&outBuf_mutex, NULL);
pthread_cond_init (&outBuf_cv, NULL);
@@ -95,10 +95,19 @@ void AudioOut::setBufferSize(int _bufferSize)
pthread_mutex_unlock(&outBuf_mutex);
};
+void AudioOut::bufferingSize(int nBuffering)
+{
+ buffering = nBuffering;
+}
+
+int AudioOut::bufferingSize()
+{
+ return buffering;
+}
const Stereo<Sample> AudioOut::getNext()
{
- const unsigned int BUFF_SIZE = 6;
+ const unsigned int BUFF_SIZE = buffering;
Stereo<Sample> ans;
pthread_mutex_lock(&outBuf_mutex);
bool isEmpty = outBuf.empty();
@@ -106,7 +115,7 @@ const Stereo<Sample> AudioOut::getNext()
if(isEmpty)//fetch samples if possible
{
- if(manager->getRunning() < BUFF_SIZE)
+ if((unsigned int)manager->getRunning() < BUFF_SIZE)
manager->requestSamples(BUFF_SIZE-manager->getRunning());
if(true)
cout << "-----------------Starvation------------------"<< endl;
diff --git a/src/Nio/AudioOut.h b/src/Nio/AudioOut.h
@@ -57,6 +57,9 @@ class AudioOut : public virtual Engine
* (used for getNext()).*/
void setBufferSize(int _bufferSize);
+ void bufferingSize(int nBuffering);
+ int bufferingSize();
+
protected:
void putBack(const Stereo<Sample> smp);
@@ -75,6 +78,11 @@ class AudioOut : public virtual Engine
bool usePartial;
Stereo<Sample> current;/**<used for xrun defence*/
+ //The number of Samples that are used to buffer
+ //Note: there is some undetermined behavior when:
+ //sampleRate != SAMPLE_RATE || bufferSize != SOUND_BUFFER_SIZE
+ unsigned int buffering;
+
OutMgr *manager;
//thread resources
pthread_t pThread;
diff --git a/src/UI/NioUI.cpp b/src/UI/NioUI.cpp
@@ -1,5 +1,6 @@
#include "NioUI.h"
#include "../Nio/EngineMgr.h"
+#include "../Nio/OutMgr.h"
#include "../Nio/AudioOut.h"
#include <cstdio>
#include <FL/Fl_Tabs.H>
@@ -69,12 +70,32 @@ void NioTab::nioToggle(Fl_Widget *wid, void *arg)
p->refresh();
}
+void NioTab::nioBuffer(Fl_Widget *wid, void *arg)
+{
+ Fl_Spinner *w = static_cast<Fl_Spinner *>(wid);
+ char *str = static_cast<char *>(arg);
+ int val = (int) w->value();
+
+ cout << "Chaning Buffer Size For " << str << endl;
+ AudioOut *out = sysOut->getOut(str);
+ if(out) {
+ cout << "Chaning Buffer Size To " << val << endl;
+ out->bufferingSize(val);
+ }
+}
+
NioTab::NioTab(string name)
:Fl_Group(10, 40, 400, 400-35, strdup(name.c_str())),
- outEnable(20 ,30 ,100, 25, "Enable"),
+ outEnable(20, 30, 100, 25, "Enable"),
+ buffer(70, 60, 50, 25, "Buffer:"),//in SOUND_BUFFER_SIZE units
name(name)
{
outEnable.callback(nioToggle, (void *)this);
+ buffer.callback(nioBuffer, (void *)name.c_str());
+ //this is a COMPLETELY arbitrary max
+ //I just assume that users do not want an overly long buffer
+ buffer.range(1, 100);
+ buffer.type(FL_INT_INPUT);
end();
}
@@ -83,6 +104,7 @@ void NioTab::refresh()
//getOut should only be called with present Engines
bool state = sysOut->getOut(name)->isEnabled();
outEnable.value(state);
+ buffer.value(sysOut->getOut(name)->bufferingSize());
this->labelcolor(fl_rgb_color(0,255*state,0));
this->redraw();
diff --git a/src/UI/NioUI.h b/src/UI/NioUI.h
@@ -5,6 +5,7 @@
#include <FL/Fl_Light_Button.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Pack.H>
+#include <FL/Fl_Spinner.H>
#include <FL/Enumerations.H>
#include <list>
#include <string>
@@ -12,9 +13,13 @@
struct NioTab : public Fl_Group
{
NioTab(std::string name);
- Fl_Light_Button outEnable;
- static void nioToggle(Fl_Widget *w, void *arg);
+
void refresh();
+ static void nioToggle(Fl_Widget *w, void *arg);
+ static void nioBuffer(Fl_Widget *w, void *arg);
+
+ Fl_Light_Button outEnable;
+ Fl_Spinner buffer;
const std::string name;
};