--- /dev/null
+//============================================================
+// AudioStream.h
+//
+//
+//============================================================
+#include "audiostream.h"\r
+
+//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=\r
+// Class AudioStream constructor
+//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=\r
+AudioStream::AudioStream(int tableSize) : tableSize_(tableSize), leftPhase_(0), rightPhase_(0)
+{
+ const double PI = 3.14159265;
+ table_ = new float[tableSize];
+ for (int i = 0; i < tableSize; ++i)
+ {
+ table_[i] = 0.125f * (float)sin(((double)i/(double)tableSize)*PI*2.);
+ }
+}
+
+//------------------------------------------------------------
+// Class AudioStream destructor
+//------------------------------------------------------------
+AudioStream::~AudioStream()
+{
+ delete[] table_;
+}
+
+//------------------------------------------------------------
+// generate()
+//------------------------------------------------------------
+int AudioStream::generate(const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags)
+{
+ assert(outputBuffer != NULL);
+
+ float **out = static_cast<float **>(outputBuffer);
+
+ for (unsigned int i = 0; i < framesPerBuffer; ++i)
+ {
+ out[0][i] = table_[leftPhase_];
+ out[1][i] = table_[rightPhase_];
+
+ leftPhase_ += 1;
+ if (leftPhase_ >= tableSize_)
+ leftPhase_ -= tableSize_;
+
+ rightPhase_ += 3;
+ if (rightPhase_ >= tableSize_)
+ rightPhase_ -= tableSize_;
+ }
+
+ return paContinue;
+}
+\r
+//------------------------------------------------------------
+// Open()
+//------------------------------------------------------------
+void AudioStream::Open()
+{
+ wxString estr;\r
+ try\r
+ {\r
+ // Create a SineGenerator object:\r
+ AudioStream AudioStream(TABLE_SIZE);\r
+\r
+ // Set up the System:\r
+ portaudio::AutoSystem autoSys;\r
+ portaudio::System &sys = portaudio::System::instance();\r
+ // Set up the parameters required to open a (Callback)Stream:\r
+ portaudio::DirectionSpecificStreamParameters outParams(sys.defaultOutputDevice(), 2, portaudio::FLOAT32, false, sys.defaultOutputDevice().defaultLowOutputLatency(), NULL);\r
+ portaudio::StreamParameters params(portaudio::DirectionSpecificStreamParameters::null(), outParams, SAMPLE_RATE, FRAMES_PER_BUFFER, paClipOff);\r
+\r
+ wxMessageBox(wxT("Opening stereo output stream..."), wxT("Info"), wxOK);\r
+ // Create (and open) a new Stream, using the SineGenerator::generate function as a callback:\r
+ portaudio::MemFunCallbackStream<AudioStream> stream(params, AudioStream, &AudioStream::generate);\r
+ wxMessageBox(wxT("Starting playback for %i seconds."), wxT("Info"), wxOK);\r
+ // Start the Stream (audio playback starts):\r
+// stream.start();\r
+ // Wait for 5 seconds:\r
+ sys.sleep(NUM_SECONDS * 1000);\r
+ wxMessageBox(wxT("Closing stream..."), wxT("Info"), wxOK);\r
+ // Stop the Stream (not strictly needed as termintating the System will also stop all open Streams):\r
+// stream.stop();\r
+ // Close the Stream (not strictly needed as terminating the System will also close all open Streams):\r
+// stream.close();\r
+ // Terminate the System (not strictly needed as the AutoSystem will also take care of this when it\r
+ // goes out of scope):\r
+ sys.terminate();\r
+ wxMessageBox(wxT("Test finished."), wxT(""), wxOK);\r
+ }\r
+ catch (const portaudio::PaException &e)\r
+ {\r
+ estr.Format(wxT("A PortAudio error occured: %s"), e.paErrorText());\r
+ wxMessageBox(estr, wxT("Error"), wxOK);\r
+ }\r
+ catch (const portaudio::PaCppException &e)\r
+ {\r
+ estr.Format(wxT("A PortAudioCpp error occured: %s"), e.what());\r
+ wxMessageBox(estr, wxT("Error"), wxOK);\r
+ }\r
+ catch (const std::exception &e)\r
+ {\r
+ estr.Format(wxT("A generic exception occured: %s"), e.what());\r
+ wxMessageBox(estr, wxT("Error"), wxOK);\r
+ }\r
+ catch (...)\r
+ {\r
+ wxMessageBox(wxT("An unknown exception occured."), wxT("Error"), wxOK);\r
+ }\r
+}\r
}\r
\r
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=\r
-// Class MainFrame(wxFrame* parent) : TopFrame(parent)\r
+// Class MainFrame(wxFrame* pa->ent) : TopFrame(pa->ent)\r
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=\r
MainFrame::MainFrame(wxWindow *parent) : TopFrame(parent)\r
{\r
m_radioRunning = false;\r
-// m_bitmap = bitmap;\r
- m_sound = NULL;\r
- m_zoom = 1.;\r
- m_SquelchActive = false;\r
-\r
+ m_sound = NULL;\r
+ m_zoom = 1.;\r
+ m_SquelchActive = false;\r
+ if(Pa_Initialize())\r
+ {\r
+ wxMessageBox(wxT("Port Audio failed to initialize"), wxT("Pa_Initialize"), wxOK);\r
+ }\r
}\r
\r
//-------------------------------------------------------------------------\r
//-------------------------------------------------------------------------\r
void MainFrame::OnCloseFrame(wxCloseEvent& event)\r
{\r
+ Pa_Terminate();\r
Destroy();\r
}\r
\r
}\r
\r
//-------------------------------------------------------------------------\r
-// OnPaint()\r
+// Onpa->nt()\r
//-------------------------------------------------------------------------\r
void MainFrame::OnPaint(wxPaintEvent& WXUNUSED(event))\r
{\r
//-------------------------------------------------------------------------\r
void MainFrame::OnTogBtnRxID(wxCommandEvent& event)\r
{\r
- wxMessageBox("Got Click!", "OnTogBtnRxID", wxOK);\r
+ wxMessageBox(wxT("Got Click!"), wxT("OnTogBtnRxID"), wxOK);\r
event.Skip();\r
}\r
\r
//-------------------------------------------------------------------------\r
void MainFrame::OnTogBtnTxID(wxCommandEvent& event)\r
{\r
- wxMessageBox("Got Click!", "OnTogBtnTxID", wxOK);\r
+ wxMessageBox(wxT("Got Click!"), wxT("OnTogBtnTxID"), wxOK);\r
event.Skip();\r
}\r
\r
//-------------------------------------------------------------------------\r
void MainFrame::OnTogBtnSplitClick(wxCommandEvent& event)\r
{\r
- wxMessageBox("Got Click!", "OnTogBtnSplitClick", wxOK);\r
+ wxMessageBox(wxT("Got Click!"), wxT("OnTogBtnSplitClick"), wxOK);\r
event.Skip();\r
}\r
\r
//-------------------------------------------------------------------------\r
void MainFrame::OnTogBtnAnalogClick (wxCommandEvent& event)\r
{\r
- wxMessageBox("Got Click!", "OnTogBtnAnalogClick", wxOK);\r
+ wxMessageBox(wxT("Got Click!"), wxT("OnTogBtnAnalogClick"), wxOK);\r
event.Skip();\r
}\r
\r
//-------------------------------------------------------------------------\r
void MainFrame::OnTogBtnALCClick(wxCommandEvent& event)\r
{\r
- wxMessageBox("Got Click!", "OnTogBtnALCClick", wxOK);\r
+ wxMessageBox(wxT("Got Click!"), wxT("OnTogBtnALCClick"), wxOK);\r
event.Skip();\r
}\r
\r
+//-------------------------------------------------------------------------\r
+// codec2Callback()\r
+//-------------------------------------------------------------------------\r
+static int codec2Callback(\r
+ const void *inBuffer,\r
+ void *outBuffer,\r
+ unsigned long framesPerBuffer,\r
+ const PaStreamCallbackTimeInfo *outTime,\r
+ PaStreamCallbackFlags statusFlags,\r
+ void *userData\r
+ )\r
+{\r
+ float *out = (float *) outBuffer;\r
+ float *in = (float *) inBuffer;\r
+ float leftIn;\r
+ float rightIn;\r
+ unsigned int i;\r
+\r
+ if(inBuffer == NULL)\r
+ {\r
+ return 0;\r
+ }\r
+ // Read input buffer, process data, and fill output buffer.\r
+ for(i = 0; i < framesPerBuffer; i++)\r
+ {\r
+ leftIn = *in++; // Get interleaved samples from input buffer.\r
+ rightIn = *in++;\r
+ *out++ = leftIn * rightIn; // ring modulation\r
+ *out++ = 0.5f * (leftIn + rightIn); // mixing\r
+ }\r
+ return paContinue; // 0;\r
+}
+\r
//-------------------------------------------------------------------------\r
// audioCallback()\r
//-------------------------------------------------------------------------\r
-static int audioCallback( const void *inputBuffer,\r
- void *outputBuffer,\r
+static int audioCallback( const void *inBuffer,\r
+ void *outBuffer,\r
unsigned long framesPerBuffer,\r
const PaStreamCallbackTimeInfo *outTime,\r
PaStreamCallbackFlags statusFlags,\r
void *userData\r
)\r
{\r
- float *out = (float *) outputBuffer;\r
- float *in = (float *) inputBuffer;\r
- float leftInput;\r
- float rightInput;\r
+ float *out = (float *) outBuffer;\r
+ float *in = (float *) inBuffer;\r
+ float leftIn;\r
+ float rightIn;\r
unsigned int i;\r
\r
- if(inputBuffer == NULL)\r
+ if(inBuffer == NULL)\r
{\r
return 0;\r
}\r
// Read input buffer, process data, and fill output buffer.\r
for(i = 0; i < framesPerBuffer; i++)\r
{\r
- leftInput = *in++; // Get interleaved samples from input buffer.\r
- rightInput = *in++;\r
- *out++ = leftInput * rightInput; // ring modulation\r
- *out++ = 0.5f * (leftInput + rightInput); // mixing\r
+ leftIn = *in++; // Get interleaved samples from input buffer.\r
+ rightIn = *in++;\r
+ *out++ = leftIn * rightIn; // ring modulation\r
+ *out++ = 0.5f * (leftIn + rightIn); // mixing\r
}\r
return paContinue; // 0;\r
}
static int fuzzCallback(const void *inputBuffer,
void *outputBuffer,
unsigned long framesPerBuffer,
- const PaStreamCallbackTimeInfo* timeInfo,
- PaStreamCallbackFlags statusFlags,
+ const pa->treamCallbackTimeInfo* timeInfo,
+ pa->treamCallbackFlags statusFlags,
void *userData)
{
SAMPLE *out = (SAMPLE*)outputBuffer;
*out++ = *in++; // right - clean
}
}
- return paContinue;
+ return pa->ontinue;
}
*/\r
//-------------------------------------------------------------------------\r
void MainFrame::OnTogBtnOnOff(wxCommandEvent& event)\r
{\r
- PortAudioWrap pa;\r
if(!m_radioRunning)\r
{\r
m_radioRunning = true;\r
- pa = PortAudioWrap();
- err = pa.init();
+ pa = new PortAudioWrap();
+// err = pa->init();
- inputDevice = pa.getDefaultInputDevice(); // default input device
+ inputDevice = pa->getDefaultInputDevice(); // default input device
if(inputDevice == paNoDevice)
{
- wxMessageBox("Error: No default input device.", "Error", wxOK);\r
+ wxMessageBox(wxT("Error: No default input device."), wxT("Error"), wxOK);\r
return;\r
}
- err = pa.setInputDevice(inputDevice);
- err = pa.setInputChannelCount(2); // stereo input
- err = pa.setInputSampleFormat(PA_SAMPLE_TYPE);
- err = pa.setInputLatency(pa.getInputDefaultLowLatency());\r
- pa.setInputHostApiStreamInfo(NULL);
+ err = pa->setInputDevice(inputDevice);
+ err = pa->setInputChannelCount(2); // stereo input
+ err = pa->setInputSampleFormat(PA_SAMPLE_TYPE);
+ err = pa->setInputLatency(pa->getInputDefaultLowLatency());\r
+ pa->setInputHostApiStreamInfo(NULL);
- outputDevice = pa.getDefaultOutputDevice(); // default output device
+ outputDevice = pa->getDefaultOutputDevice(); // default output device
if (outputDevice == paNoDevice)
{
- wxMessageBox("Error: No default output device.", "Error", wxOK);\r
+ wxMessageBox(wxT("Error: No default output device."), wxT("Error"), wxOK);\r
return;\r
}
- err = pa.setOutputDevice(outputDevice);
- err = pa.setOutputChannelCount(2); // stereo input
- err = pa.setOutputSampleFormat(PA_SAMPLE_TYPE);\r
+ err = pa->setOutputDevice(outputDevice);
+ err = pa->setOutputChannelCount(2); // stereo input
+ err = pa->setOutputSampleFormat(PA_SAMPLE_TYPE);\r
- err = pa.setOutputLatency(pa.getOutputDefaultLowLatency());
- pa.setOutputHostApiStreamInfo(NULL);
+ err = pa->setOutputLatency(pa->getOutputDefaultLowLatency());
+ pa->setOutputHostApiStreamInfo(NULL);
- err = pa.setFramesPerBuffer(FRAMES_PER_BUFFER);
- err = pa.setSampleRate(SAMPLE_RATE);
- err = pa.setStreamFlags(0);
- err = pa.setCallback(audioCallback);
- err = pa.streamOpen();
+ err = pa->setFramesPerBuffer(FRAMES_PER_BUFFER);
+ err = pa->setSampleRate(SAMPLE_RATE);
+ err = pa->setStreamFlags(0);
+ err = pa->setCallback(audioCallback);
+ err = pa->streamOpen();
if(err != paNoError)
{
- wxMessageBox("Open/Setup error.", "Error", wxOK);\r
+ wxMessageBox(wxT("Open/Setup error."), wxT("Error"), wxOK);\r
return;\r
}
- err = pa.streamStart();
+ err = pa->streamStart();
if(err != paNoError)
{
- wxMessageBox("Stream Start Error.", "Error", wxOK);\r
+ wxMessageBox(wxT("Stream Start Error."), wxT("Error"), wxOK);\r
return;\r
}
m_togBtnOnOff->SetLabel(wxT("Stop"));\r
else\r
{\r
m_radioRunning = false;\r
- pa.terminate();
+ pa->stop();\r
+// pa->abort();\r
+// delete pa;
+ //pa->terminate();\r
m_togBtnOnOff->SetLabel(wxT("Start"));\r
}\r
}\r
m_sound->Play(openFileDialog.GetPath());\r
/*\r
// this can be done with e.g. wxWidgets input streams:\r
- wxFileInputStream input_stream(openFileDialog.GetPath());\r
+ wxFileInputStream input_stream(openFileDialog.Getpa->h());\r
if (!input_stream.IsOk())\r
{\r
- wxLogError("Cannot open file '%s'.", openFileDialog.GetPath());\r
+ wxLogError("Cannot open file '%s'.", openFileDialog.Getpa->h());\r
return;\r
}\r
*/\r
//-------------------------------------------------------------------------\r
void MainFrame::OnPaste( wxCommandEvent& event )\r
{\r
- wxMessageBox("Got Click!", "OnPaste", wxOK);\r
+ wxMessageBox("Got Click!", "Onpa->te", wxOK);\r
event.Skip();\r
}\r
\r
}\r
\r
//-------------------------------------------------------------------------\r
-// OnHelpAbout()\r
+//OnHelpAbout()\r
//-------------------------------------------------------------------------\r
void MainFrame::OnHelpAbout( wxCommandEvent& event )\r
{\r
wxT("8 bpp color"),\r
wxT("8 bpp greyscale"),\r
wxT("8 bpp red"),\r
- wxT("8 bpp own palette"),\r
+ wxT("8 bpp own pa->ette"),\r
wxT("24 bpp")\r
};\r
\r