1// --------------------------------------------------------------------------
2// Name: sndbase.cpp
3// Purpose:
4// Date: 08/11/1999
5// Author: Guilhem Lavaux <lavaux@easynet.fr> (C) 1999, 2000
6// CVSID: $Id: sndbase.cpp 35650 2005-09-23 12:56:45Z MR $
7// wxWindows licence
8// --------------------------------------------------------------------------
9
10#include "wx/wxprec.h"
11
12#ifndef WX_PRECOMP
13#include "wx/defs.h"
14#include "wx/string.h"
15#include "wx/log.h"
16#endif
17
18#include "wx/mmedia/sndbase.h"
19
20
21// ---------------------------------------------------------------------------
22// wxSoundFormatBase
23// ---------------------------------------------------------------------------
24
25wxSoundFormatBase::wxSoundFormatBase()
26{
27}
28
29wxSoundFormatBase::~wxSoundFormatBase()
30{
31}
32
33wxSoundFormatBase *wxSoundFormatBase::Clone() const
34{
35    wxLogFatalError(wxT("In wxSoundFormatBase::Clone() but I should")
36                    wxT(" not be there"));
37    return NULL;
38}
39
40bool wxSoundFormatBase::operator!=(const wxSoundFormatBase& frmt2) const
41{
42    return (GetType() != frmt2.GetType());
43}
44
45// ---------------------------------------------------------------------------
46// wxSoundStream
47// ---------------------------------------------------------------------------
48
49wxSoundStream::wxSoundStream()
50{
51    int i;
52
53    // Reset all variables to their neutral value.
54    m_sndformat = NULL;
55    m_handler = NULL;
56    m_snderror = wxSOUND_NOERROR;
57    m_lastcount = 0;
58    for (i=0;i<2;i++)
59        m_callback[i] = NULL;
60}
61
62wxSoundStream::~wxSoundStream()
63{
64  if (m_sndformat)
65      delete m_sndformat;
66}
67
68// --------------------------------------------------------------------------
69// SetSoundFormat(const wxSoundFormatBase& format) is one of the most
70// important function of the wxSoundStream class. It prepares the stream to
71// receive or send the data in a strict format. Normally, the sound stream
72// should be ready to accept any format it is asked to manage but in certain
73// cases, it really cannot: in that case it returns false. To have more
74// details in the functionnalities of SetSoundFormat see
75// wxSoundRouterStream::SetSoundFormat()
76// --------------------------------------------------------------------------
77bool wxSoundStream::SetSoundFormat(const wxSoundFormatBase& format)
78{
79    // delete the previous prepared format
80    if (m_sndformat)
81      delete m_sndformat;
82
83    // create a new one by cloning the format passed in parameter
84    m_sndformat = format.Clone();
85    return true;
86}
87
88
89// --------------------------------------------------------------------------
90// Register(int evt, ...) registers the callback for a specified async event.
91// Warning ! Only one callback by event is supported. It means that if you
92// call twice this function the previous registered callback is absolutely
93// ignored.
94// --------------------------------------------------------------------------
95void wxSoundStream::SetCallback(int evt, wxSoundCallback cbk, void *cdata)
96{
97  int c;
98
99  switch (evt) {
100  case wxSOUND_INPUT:
101    c = 0;
102    break;
103  case wxSOUND_OUTPUT:
104    c = 1;
105    break;
106  default:
107    return;
108  }
109  m_callback[c] = cbk;
110  m_cdata[c] = cdata;
111}
112
113// --------------------------------------------------------------------------
114// OnSoundEvent(int evt) is called either when the driver is ready to receive
115// a new block to play or when the driver has a new recorded buffer. You
116// must be careful here and try not to spend a lot of time: this is a
117// real-time call. In the case, an "event handler" was specified previously,
118// it called him before everything.
119// --------------------------------------------------------------------------
120void wxSoundStream::OnSoundEvent(int evt)
121{
122  int c;
123
124  if (m_handler) {
125    m_handler->OnSoundEvent(evt);
126    return;
127  }
128
129  switch (evt) {
130  case wxSOUND_INPUT:
131    c = 0;
132    break;
133  case wxSOUND_OUTPUT:
134    c = 1;
135    break;
136  default:
137    return;
138  }
139  if (m_callback[c])
140    m_callback[c](this, evt, m_cdata[c]);
141}
142