+++ /dev/null
-//============================================================
-// AudioStream.h
-//
-//
-//============================================================
-#include <cmath>
-#include <cassert>
-#include <cstddef>
-#include "portaudiocpp/PortAudioCpp.hxx"
-#include <wx/wx.h>\r
-#include <wx/thread.h>
-#include "libsndfile/include/sndfile.h"\r
-#include "extern/include/portaudio.h"
-#include "extern/include/portaudiocpp/PortAudioCpp.hxx"
-
-#ifndef __AudioStream__
-#define __AudioStream__
-
-const int NUM_SECONDS = 5;
-const double SAMPLE_RATE = 44100.0;
-const int FRAMES_PER_BUFFER = 64;
-const int TABLE_SIZE = 200;
-
-class AudioStream
-{
-public:
-// AudioStream(int tableSize) : tableSize_(tableSize), leftPhase_(0), rightPhase_(0);
- AudioStream(int tableSize);
- ~AudioStream();
-
- int generate(const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags);
-
-private:
- float *table_;
- int tableSize_;
- int leftPhase_;
- int rightPhase_;
-
- void Open();
-
-protected:
-
-private:
-};\r
-
-#endif // __AudioStream__
+++ /dev/null
-#include "fdmdv2DlgAudio.h"\r
-\r
-fdmdv2DlgAudio::fdmdv2DlgAudio( wxWindow* parent )\r
-:\r
-DlgAudio( parent )\r
-{\r
-\r
-}\r
-\r
-void fdmdv2DlgAudio::OnApply( wxCommandEvent& event )\r
-{\r
-// TODO: Implement OnApply\r
-}\r
-\r
-void fdmdv2DlgAudio::OnCancel( wxCommandEvent& event )\r
-{\r
-// TODO: Implement OnCancel\r
-}\r
-\r
-void fdmdv2DlgAudio::OnOK( wxCommandEvent& event )\r
-{\r
-// TODO: Implement OnOK\r
-}\r
+++ /dev/null
-#ifndef __fdmdv2DlgAudio__\r
-#define __fdmdv2DlgAudio__\r
-\r
-/**\r
-@file\r
-Subclass of DlgAudio, which is generated by wxFormBuilder.\r
-*/\r
-\r
-#include "topFrame.h"\r
-\r
-//// end generated include\r
-\r
-/** Implementing DlgAudio */\r
-class fdmdv2DlgAudio : public DlgAudio\r
-{\r
- protected:\r
- // Handlers for DlgAudio events.\r
- void OnApply( wxCommandEvent& event );\r
- void OnCancel( wxCommandEvent& event );\r
- void OnOK( wxCommandEvent& event );\r
- public:\r
- /** Constructor */\r
- fdmdv2DlgAudio( wxWindow* parent );\r
- //// end generated class members\r
- \r
-};\r
-\r
-#endif // __fdmdv2DlgAudio__\r
+++ /dev/null
-#include "fdmdv2TopFrame.h"\r
-\r
-fdmdv2TopFrame::fdmdv2TopFrame( wxWindow* parent )\r
-:\r
-TopFrame( parent )\r
-{\r
-\r
-}\r
-\r
-void fdmdv2TopFrame::topFrame_OnClose( wxCloseEvent& event )\r
-{\r
-// TODO: Implement topFrame_OnClose\r
-}\r
-\r
-void fdmdv2TopFrame::topFrame_OnPaint( wxPaintEvent& event )\r
-{\r
-// TODO: Implement topFrame_OnPaint\r
-}\r
-\r
-void fdmdv2TopFrame::topFrame_OnSize( wxSizeEvent& event )\r
-{\r
-// TODO: Implement topFrame_OnSize\r
-}\r
-\r
-void fdmdv2TopFrame::topFrame_OnUpdateUI( wxUpdateUIEvent& event )\r
-{\r
-// TODO: Implement topFrame_OnUpdateUI\r
-}\r
-\r
-void fdmdv2TopFrame::OnOpen( wxCommandEvent& event )\r
-{\r
-// TODO: Implement OnOpen\r
-}\r
-\r
-void fdmdv2TopFrame::OnOpenUpdateUI( wxUpdateUIEvent& event )\r
-{\r
-// TODO: Implement OnOpenUpdateUI\r
-}\r
-\r
-void fdmdv2TopFrame::OnSave( wxCommandEvent& event )\r
-{\r
-// TODO: Implement OnSave\r
-}\r
-\r
-void fdmdv2TopFrame::OnSaveUpdateUI( wxUpdateUIEvent& event )\r
-{\r
-// TODO: Implement OnSaveUpdateUI\r
-}\r
-\r
-void fdmdv2TopFrame::OnClose( wxCommandEvent& event )\r
-{\r
-// TODO: Implement OnClose\r
-}\r
-\r
-void fdmdv2TopFrame::OnCloseUpdateUI( wxUpdateUIEvent& event )\r
-{\r
-// TODO: Implement OnCloseUpdateUI\r
-}\r
-\r
-void fdmdv2TopFrame::OnExit( wxCommandEvent& event )\r
-{\r
-// TODO: Implement OnExit\r
-}\r
-\r
-void fdmdv2TopFrame::OnCopy( wxCommandEvent& event )\r
-{\r
-// TODO: Implement OnCopy\r
-}\r
-\r
-void fdmdv2TopFrame::OnCopyUpdateUI( wxUpdateUIEvent& event )\r
-{\r
-// TODO: Implement OnCopyUpdateUI\r
-}\r
-\r
-void fdmdv2TopFrame::OnCut( wxCommandEvent& event )\r
-{\r
-// TODO: Implement OnCut\r
-}\r
-\r
-void fdmdv2TopFrame::OnCutUpdateUI( wxUpdateUIEvent& event )\r
-{\r
-// TODO: Implement OnCutUpdateUI\r
-}\r
-\r
-void fdmdv2TopFrame::OnPaste( wxCommandEvent& event )\r
-{\r
-// TODO: Implement OnPaste\r
-}\r
-\r
-void fdmdv2TopFrame::OnPasteUpdateUI( wxUpdateUIEvent& event )\r
-{\r
-// TODO: Implement OnPasteUpdateUI\r
-}\r
-\r
-void fdmdv2TopFrame::OnToolsAudio( wxCommandEvent& event )\r
-{\r
-// TODO: Implement OnToolsAudio\r
-}\r
-\r
-void fdmdv2TopFrame::OnToolsAudioUI( wxUpdateUIEvent& event )\r
-{\r
-// TODO: Implement OnToolsAudioUI\r
-}\r
-\r
-void fdmdv2TopFrame::OnToolsComCfg( wxCommandEvent& event )\r
-{\r
-// TODO: Implement OnToolsComCfg\r
-}\r
-\r
-void fdmdv2TopFrame::OnToolsComCfgUI( wxUpdateUIEvent& event )\r
-{\r
-// TODO: Implement OnToolsComCfgUI\r
-}\r
-\r
-void fdmdv2TopFrame::OnToolsOptions( wxCommandEvent& event )\r
-{\r
-// TODO: Implement OnToolsOptions\r
-}\r
-\r
-void fdmdv2TopFrame::OnToolsOptionsUI( wxUpdateUIEvent& event )\r
-{\r
-// TODO: Implement OnToolsOptionsUI\r
-}\r
-\r
-void fdmdv2TopFrame::OnHelpCheckUpdates( wxCommandEvent& event )\r
-{\r
-// TODO: Implement OnHelpCheckUpdates\r
-}\r
-\r
-void fdmdv2TopFrame::OnHelpCheckUpdatesUI( wxUpdateUIEvent& event )\r
-{\r
-// TODO: Implement OnHelpCheckUpdatesUI\r
-}\r
-\r
-void fdmdv2TopFrame::OnHelpAbout( wxCommandEvent& event )\r
-{\r
-// TODO: Implement OnHelpAbout\r
-}\r
-\r
-void fdmdv2TopFrame::OnTogBtnRxID( wxCommandEvent& event )\r
-{\r
-// TODO: Implement OnTogBtnRxID\r
-}\r
-\r
-void fdmdv2TopFrame::OnTogBtnTxID( wxCommandEvent& event )\r
-{\r
-// TODO: Implement OnTogBtnTxID\r
-}\r
-\r
-void fdmdv2TopFrame::OnCmdSliderScroll( wxScrollEvent& event )\r
-{\r
-// TODO: Implement OnCmdSliderScroll\r
-}\r
-\r
-void fdmdv2TopFrame::OnSliderScrollBottom( wxScrollEvent& event )\r
-{\r
-// TODO: Implement OnSliderScrollBottom\r
-}\r
-\r
-void fdmdv2TopFrame::OnCmdSliderScrollChanged( wxScrollEvent& event )\r
-{\r
-// TODO: Implement OnCmdSliderScrollChanged\r
-}\r
-\r
-void fdmdv2TopFrame::OnSliderScrollTop( wxScrollEvent& event )\r
-{\r
-// TODO: Implement OnSliderScrollTop\r
-}\r
-\r
-void fdmdv2TopFrame::OnCheckSQClick( wxCommandEvent& event )\r
-{\r
-// TODO: Implement OnCheckSQClick\r
-}\r
-\r
-void fdmdv2TopFrame::OnTogBtnSplitClick( wxCommandEvent& event )\r
-{\r
-// TODO: Implement OnTogBtnSplitClick\r
-}\r
-\r
-void fdmdv2TopFrame::OnTogBtnAnalogClick( wxCommandEvent& event )\r
-{\r
-// TODO: Implement OnTogBtnAnalogClick\r
-}\r
-\r
-void fdmdv2TopFrame::OnTogBtnALCClick( wxCommandEvent& event )\r
-{\r
-// TODO: Implement OnTogBtnALCClick\r
-}\r
-\r
-void fdmdv2TopFrame::OnTogBtnTXClick( wxCommandEvent& event )\r
-{\r
-// TODO: Implement OnTogBtnTXClick\r
-}\r
+++ /dev/null
-#ifndef __fdmdv2TopFrame__\r
-#define __fdmdv2TopFrame__\r
-\r
-/**\r
-@file\r
-Subclass of TopFrame, which is generated by wxFormBuilder.\r
-*/\r
-\r
-#include "topFrame.h"\r
-\r
-//// end generated include\r
-\r
-/** Implementing TopFrame */\r
-class fdmdv2TopFrame : public TopFrame\r
-{\r
- protected:\r
- // Handlers for TopFrame events.\r
- void topFrame_OnClose( wxCloseEvent& event );\r
- void topFrame_OnPaint( wxPaintEvent& event );\r
- void topFrame_OnSize( wxSizeEvent& event );\r
- void topFrame_OnUpdateUI( wxUpdateUIEvent& event );\r
- void OnOpen( wxCommandEvent& event );\r
- void OnOpenUpdateUI( wxUpdateUIEvent& event );\r
- void OnSave( wxCommandEvent& event );\r
- void OnSaveUpdateUI( wxUpdateUIEvent& event );\r
- void OnClose( wxCommandEvent& event );\r
- void OnCloseUpdateUI( wxUpdateUIEvent& event );\r
- void OnExit( wxCommandEvent& event );\r
- void OnCopy( wxCommandEvent& event );\r
- void OnCopyUpdateUI( wxUpdateUIEvent& event );\r
- void OnCut( wxCommandEvent& event );\r
- void OnCutUpdateUI( wxUpdateUIEvent& event );\r
- void OnPaste( wxCommandEvent& event );\r
- void OnPasteUpdateUI( wxUpdateUIEvent& event );\r
- void OnToolsAudio( wxCommandEvent& event );\r
- void OnToolsAudioUI( wxUpdateUIEvent& event );\r
- void OnToolsComCfg( wxCommandEvent& event );\r
- void OnToolsComCfgUI( wxUpdateUIEvent& event );\r
- void OnToolsOptions( wxCommandEvent& event );\r
- void OnToolsOptionsUI( wxUpdateUIEvent& event );\r
- void OnHelpCheckUpdates( wxCommandEvent& event );\r
- void OnHelpCheckUpdatesUI( wxUpdateUIEvent& event );\r
- void OnHelpAbout( wxCommandEvent& event );\r
- void OnTogBtnRxID( wxCommandEvent& event );\r
- void OnTogBtnTxID( wxCommandEvent& event );\r
- void OnCmdSliderScroll( wxScrollEvent& event );\r
- void OnSliderScrollBottom( wxScrollEvent& event );\r
- void OnCmdSliderScrollChanged( wxScrollEvent& event );\r
- void OnSliderScrollTop( wxScrollEvent& event );\r
- void OnCheckSQClick( wxCommandEvent& event );\r
- void OnTogBtnSplitClick( wxCommandEvent& event );\r
- void OnTogBtnAnalogClick( wxCommandEvent& event );\r
- void OnTogBtnALCClick( wxCommandEvent& event );\r
- void OnTogBtnTXClick( wxCommandEvent& event );\r
- public:\r
- /** Constructor */\r
- fdmdv2TopFrame( wxWindow* parent );\r
- //// end generated class members\r
- \r
-};\r
-\r
-#endif // __fdmdv2TopFrame__\r
+++ /dev/null
-#ifndef __THREAD_AUDIO__
-#define __THREAD_AUDIO__
-#include "wx/thread.h" // Base class: wxThread
-
-//namespace NSfdmdv2Audio
-//{
- class Fdmdv2ThreadAudio : public wxThread
- {
- public:
- Fdmdv2ThreadAudio();
- ~Fdmdv2ThreadAudio();
- public:
- virtual void* Entry();
- virtual void OnDelete();
- virtual void OnExit();
- virtual void OnKill();
- virtual bool TestDestroy();
- };
-//}
-#endif // __THREAD_AUDIO__
+++ /dev/null
-audiostream.cpp : audiostream.h
-dlg_about.cpp : dlg_about.h
-dlg_audio.cpp : dlg_audio.h
-dlg_comports.cpp : dlg_comports.h
-dlg_options.cpp : dlg_options.h
-fdmdv2DlgAudio.cpp : fdmdv2DlgAudio.h
-fdmdv2TopFrame.cpp : fdmdv2TopFrame.h
-fdmdv2_main.cpp : fdmdv2_main.h
-fdmdv2_plot.cpp : fdmdv2_plot.h
-fdmdv2_thread_audio.h
-paclass.cpp : paclass.h
-thread_audio.cpp : thread_audio.h
-topFrame.cpp : topFrame.h
-
-#topFrame.py
-#topFrame.xrc
-#credits.txt
-#FDMDV2.fbp
-
-audiostream.cpp
-audiostream.h
-credits.txt
-dlg_about.cpp
-dlg_about.h
-dlg_audio.cpp
-dlg_audio.h
-dlg_comports.cpp
-dlg_comports.h
-dlg_options.cpp
-dlg_options.h
-FDMDV2.fbp
-fdmdv2DlgAudio.cpp
-fdmdv2DlgAudio.h
-fdmdv2TopFrame.cpp
-fdmdv2TopFrame.h
-fdmdv2_main.cpp
-fdmdv2_main.h
-fdmdv2_plot.cpp
-fdmdv2_plot.h
-fdmdv2_thread_audio.h
-paclass.cpp
-paclass.h
-thread_audio.cpp
-thread_audio.h
-topFrame.cpp
-topFrame.h
-topFrame.py
-topFrame.xrc
\ No newline at end of file
+++ /dev/null
-//==========================================================================\r
-// Name: thread_audio.cpp\r
-//\r
-// Purpose: Implements a thread for processing an audio data stream.\r
-// Created: May 11, 2012
-// Initial author: David Witten\r
-// License: BSD License (other licenses may apply to other\r
-// components of this project)\r
-//==========================================================================\r
-#include "thread_audio.h"\r
-\r
-// declare a new type of event, to be used by our MyThread class:\r
-wxDECLARE_EVENT(wxEVT_COMMAND_AUDIOTHREAD_COMPLETED, wxThreadEvent);\r
-wxDECLARE_EVENT(wxEVT_COMMAND_AUDIOTHREAD_UPDATE, wxThreadEvent);\r
-\r
-#include "stdio.h"\r
-#include "extern/include/portaudio.h"\r
-\r
-/* This will be called asynchronously by the PortAudio engine. */\r
-static int audioCallback( void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, PaTime outTime, void *userData )\r
-{\r
- float *out = (float *) outputBuffer;\r
- float *in = (float *) inputBuffer;\r
- float leftInput, rightInput;\r
- unsigned int i;\r
-\r
- if( inputBuffer == 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
- }\r
- return 0;\r
-}\r
-\r
-AudioThread::AudioThread()
-{
-}
-
-AudioThread::~AudioThread()
-{
-}
-
-void* AudioThread::Entry()
-{
- return NULL;
-}
-void AudioThread::OnDelete()
-{
-}
-void AudioThread::OnExit()
-{
-}
-void AudioThread::OnKill()
-{
-}\r
-
-// bool Fdmdv2ThreadAudio::TestDestroy()
-// {
-// }
-\r
-#ifdef PORTAUDIO_MAIN\r
-/* Use a PortAudioStream to process audio data. */\r
-int main(void)\r
-{\r
- PortAudioWrap *stream;\r
- Pa_Initialize();\r
- //Pa_OpenDefaultStream(&stream, 2, 2, /* stereo input and output */ paFloat32, 44100.0, 64, 0, /* 64 frames per buffer, let PA determine numBuffers */audioCallback, NULL );\r
- Pa_OpenDefaultStream(&stream, 2, 2, paFloat32, 44100.0, 64, 0, audioCallback, NULL );\r
- Pa_StartStream( stream );\r
- Pa_Sleep( 10000 ); /* Sleep for 10 seconds while processing. */\r
- Pa_StopStream( stream );\r
- Pa_CloseStream( stream );\r
- Pa_Terminate();\r
- return 0;\r
-}\r
-#endif //PORTAUDIO_MAIN\r
+++ /dev/null
-//==========================================================================\r
-// Name: thread_audio.h\r
-//
-// Purpose: Declares background thread classes to handle audio IO.
-// Created: May 11, 2012
-// Initial author: David Witten\r
-// License: BSD License (other licenses may apply to other\r
-// components of this project)\r
-//==========================================================================\r
-#include <wx/thread.h>
-#include "fdmdv2_main.h"\r
-\r
-#ifndef __THREAD_AUDIO__
-#define __THREAD_AUDIO__
-\r
-//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=\r
-// Class AudioThread\r
-//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=\r
-class AudioThread: public wxThread\r
-{\r
- public:\r
- AudioThread(MainFrame *handler) : wxThread(wxTHREAD_DETACHED){ m_pHandler = handler; }\r
- ~AudioThread();\r
- void *Entry();
- void OnDelete();
- void OnExit();
- void OnKill();
- bool TestDestroy();
-\r
- protected:\r
- //ExitCode Entry();\r
- MainFrame *m_pHandler;\r
-};\r
-\r
- // declare a new type of event, to be used by our MyThread class:\r
- wxDECLARE_EVENT(wxEVT_COMMAND_MYTHREAD_COMPLETED, wxThreadEvent);\r
- wxDECLARE_EVENT(wxEVT_COMMAND_MYTHREAD_UPDATE, wxThreadEvent);\r
- class MyFrame;\r
-\r
- class MyThread : public wxThread\r
- {\r
- public:\r
- MyThread(MyFrame *handler)\r
- : wxThread(wxTHREAD_DETACHED)\r
- { m_pHandler = handler }\r
- ~MyThread();\r
-\r
- protected:\r
- virtual ExitCode Entry();\r
- MyFrame *m_pHandler;\r
- };\r
-\r
- class MyFrame : public wxFrame\r
- {\r
- public:\r
- ...\r
- ~MyFrame()\r
- {\r
- // it's better to do any thread cleanup in the OnClose()\r
- // event handler, rather than in the destructor.\r
- // This is because the event loop for a top-level window is not\r
- // active anymore when its destructor is called and if the thread\r
- // sends events when ending, they won't be processed unless\r
- // you ended the thread from OnClose.\r
- // See @ref overview_windowdeletion for more info.\r
- }\r
- ...\r
- void DoStartThread();\r
- void DoPauseThread();\r
-\r
- // a resume routine would be nearly identic to DoPauseThread()\r
- void DoResumeThread() { ... }\r
-\r
- void OnThreadUpdate(wxThreadEvent&);\r
- void OnThreadCompletion(wxThreadEvent&);\r
- void OnClose(wxCloseEvent&);\r
-\r
- protected:\r
- MyThread *m_pThread;\r
- wxCriticalSection m_pThreadCS; // protects the m_pThread pointer\r
-\r
- wxDECLARE_EVENT_TABLE();\r
- };\r
-\r
- wxBEGIN_EVENT_TABLE(MyFrame, wxFrame)\r
- EVT_CLOSE(MyFrame::OnClose)\r
- EVT_MENU(Minimal_Start, MyFrame::DoStartThread)\r
- EVT_COMMAND(wxID_ANY, wxEVT_COMMAND_MYTHREAD_UPDATE, MyFrame::OnThreadUpdate)\r
- EVT_COMMAND(wxID_ANY, wxEVT_COMMAND_MYTHREAD_COMPLETED, MyFrame::OnThreadCompletion)\r
- wxEND_EVENT_TABLE()\r
-\r
- wxDEFINE_EVENT(wxEVT_COMMAND_MYTHREAD_COMPLETED, wxThreadEvent)\r
- wxDEFINE_EVENT(wxEVT_COMMAND_MYTHREAD_UPDATE, wxThreadEvent)\r
-\r
- void MyFrame::DoStartThread()\r
- {\r
- m_pThread = new MyThread(this);\r
-\r
- if ( m_pThread->Create() != wxTHREAD_NO_ERROR )\r
- {\r
- wxLogError("Can't create the thread!");\r
- delete m_pThread;\r
- m_pThread = NULL;\r
- }\r
- else\r
- {\r
- if (m_pThread->Run() != wxTHREAD_NO_ERROR )\r
- {\r
- wxLogError("Can't create the thread!");\r
- delete m_pThread;\r
- m_pThread = NULL;\r
- }\r
-\r
- // after the call to wxThread::Run(), the m_pThread pointer is "unsafe":\r
- // at any moment the thread may cease to exist (because it completes its work).\r
- // To avoid dangling pointers OnThreadExit() will set m_pThread\r
- // to NULL when the thread dies.\r
- }\r
- }\r
-\r
- wxThread::ExitCode MyThread::Entry()\r
- {\r
- while (!TestDestroy())\r
- {\r
- // ... do a bit of work...\r
-\r
- wxQueueEvent(m_pHandler, new wxThreadEvent(wxEVT_COMMAND_MYTHREAD_UPDATE));\r
- }\r
-\r
- // signal the event handler that this thread is going to be destroyed\r
- // NOTE: here we assume that using the m_pHandler pointer is safe,\r
- // (in this case this is assured by the MyFrame destructor)\r
- wxQueueEvent(m_pHandler, new wxThreadEvent(wxEVT_COMMAND_MYTHREAD_COMPLETED));\r
-\r
- return (wxThread::ExitCode)0; // success\r
- }\r
-\r
- MyThread::~MyThread()\r
- {\r
- wxCriticalSectionLocker enter(m_pHandler->m_pThreadCS);\r
-\r
- // the thread is being destroyed; make sure not to leave dangling pointers around\r
- m_pHandler->m_pThread = NULL;\r
- }\r
-\r
- void MyFrame::OnThreadCompletion(wxThreadEvent&)\r
- {\r
- wxMessageOutputDebug().Printf("MYFRAME: MyThread exited!\n");\r
- }\r
-\r
- void MyFrame::OnThreadUpdate(wxThreadEvent&)\r
- {\r
- wxMessageOutputDebug().Printf("MYFRAME: MyThread update...\n");\r
- }\r
-\r
- void MyFrame::DoPauseThread()\r
- {\r
- // anytime we access the m_pThread pointer we must ensure that it won't\r
- // be modified in the meanwhile; since only a single thread may be\r
- // inside a given critical section at a given time, the following code\r
- // is safe:\r
- wxCriticalSectionLocker enter(m_pThreadCS);\r
-\r
- if (m_pThread) // does the thread still exist?\r
- {\r
- // without a critical section, once reached this point it may happen\r
- // that the OS scheduler gives control to the MyThread::Entry() function,\r
- // which in turn may return (because it completes its work) making\r
- // invalid the m_pThread pointer\r
-\r
- if (m_pThread->Pause() != wxTHREAD_NO_ERROR )\r
- wxLogError("Can't pause the thread!");\r
- }\r
- }\r
-\r
- void MyFrame::OnClose(wxCloseEvent&)\r
- {\r
- {\r
- wxCriticalSectionLocker enter(m_pThreadCS);\r
-\r
- if (m_pThread) // does the thread still exist?\r
- {\r
- wxMessageOutputDebug().Printf("MYFRAME: deleting thread");\r
-\r
- if (m_pThread->Delete() != wxTHREAD_NO_ERROR )\r
- wxLogError("Can't delete the thread!");\r
- }\r
- } // exit from the critical section to give the thread\r
- // the possibility to enter its destructor\r
- // (which is guarded with m_pThreadCS critical section!)\r
-\r
- while (1)\r
- {\r
- { // was the ~MyThread() function executed?\r
- wxCriticalSectionLocker enter(m_pThreadCS);\r
- if (!m_pThread) break;\r
- }\r
-\r
- // wait for thread completion\r
- wxThread::This()->Sleep(1);\r
- }\r
-\r
- Destroy();\r
- }\r
-\r
-\r
-#endif // __THREAD_AUDIO__