git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6139
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
#define MY_ESD_NAME "wxWindows/wxSoundStreamESD"
#define MY_ESD_NAME "wxWindows/wxSoundStreamESD"
+// -----------------------------------------------------------------------------------------------
+// wxSoundStreamESD: ESD sound driver
+
+
+// --------------------------------------------------------------------------------------------
+// Constructors/Destructors
+// --------------------------------------------------------------------------------------------
+
wxSoundStreamESD::wxSoundStreamESD(const wxString& hostname)
{
wxSoundFormatPcm pcm_default;
wxSoundStreamESD::wxSoundStreamESD(const wxString& hostname)
{
wxSoundFormatPcm pcm_default;
- m_fd = esd_play_stream(ESD_PLAY | ESD_STREAM | ESD_MONO | ESD_BITS8, 22050,
-// hostname.mb_str(), MY_ESD_NAME);
- NULL, MY_ESD_NAME);
+ // First, we make some basic test: is there ESD on this computer ?
+ if (hostname.IsNull())
+ m_fd_output = esd_play_stream(ESD_PLAY | ESD_STREAM, 22050,
+ hostname.mb_str(), MY_ESD_NAME);
+ else
+ m_fd_output = esd_play_stream(ESD_PLAY | ESD_STREAM, 22050,
+ NULL, MY_ESD_NAME);
+ if (m_fd_output == -1) {
+ // Answer: no. We return with an error.
m_snderror = wxSOUND_INVDEV;
return;
}
m_snderror = wxSOUND_INVDEV;
return;
}
+ // Close this unuseful stream.
+ esd_close(m_fd_output);
+ // Set the default audio format
SetSoundFormat(pcm_default);
SetSoundFormat(pcm_default);
+ // Initialize some variable
m_snderror = wxSOUND_NOERR;
m_esd_stop = TRUE;
m_q_filled = TRUE;
m_snderror = wxSOUND_NOERR;
m_esd_stop = TRUE;
m_q_filled = TRUE;
}
wxSoundStreamESD::~wxSoundStreamESD()
{
}
wxSoundStreamESD::~wxSoundStreamESD()
{
- if (m_fd > 0)
- esd_close(m_fd);
+ // Close all remaining streams
+ if (m_fd_output > 0)
+ esd_close(m_fd_output);
+ if (m_fd_input > 0)
+ esd_close(m_fd_input);
+// --------------------------------------------------------------------------------------------
+// Read several samples
+// --------------------------------------------------------------------------------------------
wxSoundStream& wxSoundStreamESD::Read(void *buffer, wxUint32 len)
{
int ret;
wxSoundStream& wxSoundStreamESD::Read(void *buffer, wxUint32 len)
{
int ret;
- m_lastcount = (wxUint32)ret = read(m_fd, buffer, len);
+ m_lastcount = (wxUint32)ret = read(m_fd_input, buffer, len);
if (ret < 0)
m_snderror = wxSOUND_IOERR;
if (ret < 0)
m_snderror = wxSOUND_IOERR;
+// --------------------------------------------------------------------------------------------
+// Write several samples
+// --------------------------------------------------------------------------------------------
wxSoundStream& wxSoundStreamESD::Write(const void *buffer, wxUint32 len)
{
int ret;
wxSoundStream& wxSoundStreamESD::Write(const void *buffer, wxUint32 len)
{
int ret;
- m_lastcount = (wxUint32)ret = write(m_fd, buffer, len);
+ m_lastcount = (wxUint32)ret = write(m_fd_output, buffer, len);
if (ret < 0)
m_snderror = wxSOUND_IOERR;
if (ret < 0)
m_snderror = wxSOUND_IOERR;
+// --------------------------------------------------------------------------------------------
+// SetSoundFormat(): this function specifies which format we want and which format is available
+// --------------------------------------------------------------------------------------------
+
bool wxSoundStreamESD::SetSoundFormat(const wxSoundFormatBase& format)
{
wxSoundFormatPcm *pcm_format;
bool wxSoundStreamESD::SetSoundFormat(const wxSoundFormatBase& format)
{
wxSoundFormatPcm *pcm_format;
+ if (m_fd_input == -1 && m_fd_output == -1) {
m_snderror = wxSOUND_INVDEV;
return FALSE;
}
m_snderror = wxSOUND_INVDEV;
return FALSE;
}
+// --------------------------------------------------------------------------------------------
+// _wxSound_OSS_CBack (internal): it is called when the driver (ESD) is ready for a next
+// buffer.
+// --------------------------------------------------------------------------------------------
#ifdef __WXGTK__
static void _wxSound_OSS_CBack(gpointer data, int source,
GdkInputCondition condition)
#ifdef __WXGTK__
static void _wxSound_OSS_CBack(gpointer data, int source,
GdkInputCondition condition)
+// --------------------------------------------------------------------------------------------
+// WakeUpEvt() (internal): it is called by _wxSound_OSS_CBack to bypass the C++ protection
+// --------------------------------------------------------------------------------------------
void wxSoundStreamESD::WakeUpEvt(int evt)
{
m_q_filled = FALSE;
OnSoundEvent(evt);
}
void wxSoundStreamESD::WakeUpEvt(int evt)
{
m_q_filled = FALSE;
OnSoundEvent(evt);
}
+// --------------------------------------------------------------------------------------------
+// StartProduction(): see wxSoundStream
+// --------------------------------------------------------------------------------------------
bool wxSoundStreamESD::StartProduction(int evt)
{
wxSoundFormatPcm *pcm;
bool wxSoundStreamESD::StartProduction(int evt)
{
wxSoundFormatPcm *pcm;
flag |= (pcm->GetBPS() == 16) ? ESD_BITS16 : ESD_BITS8;
flag |= (pcm->GetChannels() == 2) ? ESD_STEREO : ESD_MONO;
flag |= (pcm->GetBPS() == 16) ? ESD_BITS16 : ESD_BITS8;
flag |= (pcm->GetChannels() == 2) ? ESD_STEREO : ESD_MONO;
- if (evt == wxSOUND_OUTPUT) {
+ if ((evt & wxSOUND_OUTPUT) != 0) {
flag |= ESD_PLAY | ESD_STREAM;
flag |= ESD_PLAY | ESD_STREAM;
- m_fd = esd_play_stream(flag, pcm->GetSampleRate(), NULL,
- MY_ESD_NAME);
- } else {
+ m_fd_output = esd_play_stream(flag, pcm->GetSampleRate(), NULL,
+ MY_ESD_NAME);
+ }
+
+ if ((evt & wxSOUND_INPUT) != 0) {
flag |= ESD_RECORD | ESD_STREAM;
flag |= ESD_RECORD | ESD_STREAM;
- m_fd = esd_record_stream(flag, pcm->GetSampleRate(), NULL,
- MY_ESD_NAME);
+ m_fd_input = esd_record_stream(flag, pcm->GetSampleRate(), NULL,
+ MY_ESD_NAME);
- if (evt == wxSOUND_OUTPUT)
- m_tag = gdk_input_add(m_fd, GDK_INPUT_WRITE, _wxSound_OSS_CBack, (gpointer)this);
- else
- m_tag = gdk_input_add(m_fd, GDK_INPUT_READ, _wxSound_OSS_CBack, (gpointer)this);
+ if ((evt & wxSOUND_OUTPUT) != 0) {
+ m_tag_output = gdk_input_add(m_fd_output, GDK_INPUT_WRITE, _wxSound_OSS_CBack, (gpointer)this);
+ }
+ if ((evt & wxSOUND_INPUT) != 0) {
+ m_tag_input = gdk_input_add(m_fd_input, GDK_INPUT_READ, _wxSound_OSS_CBack, (gpointer)this);
+ }
#endif
m_esd_stop = FALSE;
#endif
m_esd_stop = FALSE;
if (m_esd_stop)
return FALSE;
if (m_esd_stop)
return FALSE;
- gdk_input_remove(m_tag);
- esd_close(m_fd);
+ if (m_fd_input != -1) {
+ esd_close(m_fd_input);
+#ifdef __WXGTK__
+ gdk_input_remove(m_tag_input);
+#endif
+ }
+ if (m_fd_output != -1) {
+ esd_close(m_fd_output);
+#ifdef __WXGTK__
+ gdk_input_remove(m_tag_output);
+#endif
+ }
+
+ m_fd_input = -1;
+ m_fd_output= -1;
m_esd_stop = TRUE;
m_q_filled = TRUE;
return TRUE;
m_esd_stop = TRUE;
m_q_filled = TRUE;
return TRUE;
bool QueueFilled() const { return m_q_filled; }
protected:
bool QueueFilled() const { return m_q_filled; }
protected:
+ int m_fd_input, m_fd_output;
+ int m_tag_input, m_tag_output;
bool m_esd_stop;
wxString m_hostname;
bool m_q_filled;
bool m_esd_stop;
wxString m_hostname;
bool m_q_filled;
virtual bool AttachOutput(wxWindow& output);
//
virtual void DetachOutput();
virtual bool AttachOutput(wxWindow& output);
//
virtual void DetachOutput();
+
+ virtual bool IsPaused() = 0;
+ virtual bool IsStopped() = 0;
};
extern wxFrame *wxVideoCreateFrame(wxVideoBaseDriver *vid_drv);
};
extern wxFrame *wxVideoCreateFrame(wxVideoBaseDriver *vid_drv);
IMPLEMENT_DYNAMIC_CLASS(wxVideoXANIM, wxVideoBaseDriver)
IMPLEMENT_DYNAMIC_CLASS(wxVideoXANIM, wxVideoBaseDriver)
+class wxVideoXANIMProcess: public wxProcess {
+ public:
+ wxVideoXANIMProcess(wxVideoXANIM *xanim);
+
+ void OnTerminate(int pid, int status);
+
+ protected:
+ wxVideoXANIM *m_vid_xanim;
+};
+
+
+wxVideoXANIMProcess::wxVideoXANIMProcess(wxVideoXANIM *xanim)
+{
+ m_vid_xanim = xanim;
+}
+
+void wxVideoXANIMProcess::OnTerminate(int WXUNUSED(pid), int WXUNUSED(status))
+{
+ m_vid_xanim->m_xanim_started = FALSE;
+}
+
wxVideoXANIM::wxVideoXANIM()
: wxVideoBaseDriver()
{
m_internal = new wxXANIMinternal;
wxVideoXANIM::wxVideoXANIM()
: wxVideoBaseDriver()
{
m_internal = new wxXANIMinternal;
+ m_xanim_detector = new wxVideoXANIMProcess(this);
m_xanim_started = FALSE;
m_paused = FALSE;
m_filename = "";
m_xanim_started = FALSE;
m_paused = FALSE;
m_filename = "";
: wxVideoBaseDriver(str)
{
m_internal = new wxXANIMinternal;
: wxVideoBaseDriver(str)
{
m_internal = new wxXANIMinternal;
+ m_xanim_detector = new wxVideoXANIMProcess(this);
m_xanim_started = FALSE;
m_paused = FALSE;
m_xanim_started = FALSE;
m_paused = FALSE;
if (m_xanim_started)
Stop();
delete m_internal;
if (m_xanim_started)
Stop();
delete m_internal;
+ delete m_xanim_detector;
wxRemoveFile(m_filename);
}
wxRemoveFile(m_filename);
}
+bool wxVideoXANIM::IsPaused()
+{
+ return m_paused;
+}
+
+bool wxVideoXANIM::IsStopped()
+{
+ return !m_xanim_started;
+}
+
bool wxVideoXANIM::AttachOutput(wxWindow& out)
{
if (!wxVideoBaseDriver::AttachOutput(out))
bool wxVideoXANIM::AttachOutput(wxWindow& out)
{
if (!wxVideoBaseDriver::AttachOutput(out))
WXSTRINGCAST m_filename);
// Execute it
WXSTRINGCAST m_filename);
// Execute it
- if (!wxExecute(xanim_command, FALSE))
+ if (!wxExecute(xanim_command, FALSE, m_xanim_detector))
return FALSE;
// Wait for XAnim to be ready
nitems = 0;
return FALSE;
// Wait for XAnim to be ready
nitems = 0;
+ m_xanim_started = TRUE;
+ while (nitems == 0 && m_xanim_started) {
ret = XGetWindowProperty(m_internal->xanim_dpy, m_internal->xanim_window,
m_internal->xanim_atom,
0, 4, False, AnyPropertyType, &prop_type,
&prop_format, &nitems, &extra,
(unsigned char **)&prop);
ret = XGetWindowProperty(m_internal->xanim_dpy, m_internal->xanim_window,
m_internal->xanim_atom,
0, 4, False, AnyPropertyType, &prop_type,
&prop_format, &nitems, &extra,
(unsigned char **)&prop);
- m_xanim_started = TRUE;
#define __VID_xanim_H__
#ifdef __GNUG__
#define __VID_xanim_H__
#ifdef __GNUG__
+ #pragma interface "vidxanm.h"
+#include "wx/defs.h"
+#include "wx/string.h"
+#include "wx/process.h"
+
#if defined(WXMMEDIA_INTERNAL) && (defined(__X__) || defined(__WXGTK__))
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#if defined(WXMMEDIA_INTERNAL) && (defined(__X__) || defined(__WXGTK__))
#include <X11/Xlib.h>
#include <X11/Xatom.h>
bool m_xanim_started, m_paused;
struct wxXANIMinternal *m_internal;
wxString m_filename;
bool m_xanim_started, m_paused;
struct wxXANIMinternal *m_internal;
wxString m_filename;
+ wxProcess *m_xanim_detector;
public:
wxVideoXANIM();
wxVideoXANIM(wxInputStream& str);
public:
wxVideoXANIM();
wxVideoXANIM(wxInputStream& str);
bool AttachOutput(wxWindow& output);
void DetachOutput();
bool AttachOutput(wxWindow& output);
void DetachOutput();
+ bool IsPaused();
+ bool IsStopped();
+
+ friend class wxVideoXANIMProcess;
+
protected:
///
bool RestartXANIM();
protected:
///
bool RestartXANIM();