typedef struct _wxSoundInternal wxSoundInternal;
typedef struct _wxSoundInfoHeader wxSoundInfoHeader;
-extern char wxCanvasClassName[];
+extern const wxChar *wxCanvasClassName;
wxList *wxSoundHandleList = NULL;
m_internal->m_input_enabled = FALSE;
m_internal->m_output_enabled = FALSE;
+ m_waiting_for = FALSE;
+
if (!OpenDevice(wxSOUND_OUTPUT))
return;
return FALSE;
}
- m_current_frag_in = WXSOUND_MAX_QUEUE-1;
- m_input_frag_in = 0;
+ m_current_frag_in = WXSOUND_MAX_QUEUE-1;
+ m_input_frag_in = 0;
m_internal->m_input_enabled = TRUE;
}
void wxSoundStreamWin::CloseDevice()
{
if (m_internal->m_output_enabled) {
- m_internal->m_output_enabled = FALSE;
- waveOutReset(m_internal->m_devout);
FreeHeaders(wxSOUND_OUTPUT);
+ m_internal->m_output_enabled = FALSE;
waveOutClose(m_internal->m_devout);
}
if (m_internal->m_input_enabled) {
- m_internal->m_input_enabled = FALSE;
- waveInReset(m_internal->m_devin);
FreeHeaders(wxSOUND_INPUT);
+ m_internal->m_input_enabled = FALSE;
waveInClose(m_internal->m_devin);
}
}
header->dwUser = (DWORD)info;
header->dwFlags = WHDR_DONE;
-
// "Prepare" the header
if (mode == wxSOUND_INPUT) {
MMRESULT result;
memset(info->m_data + info->m_position, 0, info->m_size);
AddToQueue(info);
}
+ }
+ if (m_waiting_for) {
+ // PROBLEM //
return;
}
-
+ m_waiting_for = TRUE;
// Else, we wait for its termination
while (info->m_playing || info->m_recording)
wxYield();
+ m_waiting_for = FALSE;
}
// -------------------------------------------------------------------------
info = m_headers_play[m_output_frag_out];
ClearHeader(info);
m_queue_filled = FALSE;
- OnSoundEvent(wxSOUND_OUTPUT);
+ if (!m_waiting_for)
+ OnSoundEvent(wxSOUND_OUTPUT);
} else {
if (!m_internal->m_input_enabled)
return;
- m_input_frag_in = (m_input_frag_in + 1) % WXSOUND_MAX_QUEUE;
m_headers_rec[m_input_frag_in]->m_recording = FALSE;
- OnSoundEvent(wxSOUND_INPUT);
+ m_input_frag_in = (m_input_frag_in + 1) % WXSOUND_MAX_QUEUE;
+ if (!m_waiting_for)
+ OnSoundEvent(wxSOUND_INPUT);
m_queue_filled = FALSE;
}
}
m_queue_filled = FALSE;
// Send a dummy event to start.
if (evt & wxSOUND_OUTPUT)
- OnSoundEvent(evt);
+ OnSoundEvent(wxSOUND_OUTPUT);
if (evt & wxSOUND_INPUT) {
int i;
// -------------------------------------------------------------------------
bool wxSoundStreamWin::StopProduction()
{
- if (m_internal->m_input_enabled)
- waveInStop(m_internal->m_devin);
-
m_production_started = FALSE;
CloseDevice();
return TRUE;
// Internal but defined as public
void NotifyDoneBuffer(wxUint32 dev_handle, int flag);
+ wxUint32 GetBestSize() const { return 4096; }
+
protected:
wxSoundInternal *m_internal;
wxUint32 m_current_frag_in, m_current_frag_out;
wxUint32 m_input_frag_in, m_output_frag_out;
wxSoundInfoHeader **m_headers_play, **m_headers_rec;
- bool m_production_started, m_queue_filled;
+ bool m_production_started, m_queue_filled, m_waiting_for;
protected:
void CreateSndWindow();