Added GSocket/wxSocket alias to socket.h to prevent us from using GSocket

internal symbols
Added G721 filter for Wave
Fixed a bug in wxsocket sample


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3563 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Guilhem Lavaux
1999-09-05 05:51:05 +00:00
parent 11d737b409
commit aa8fb7a016
9 changed files with 149 additions and 76 deletions

View File

@@ -63,9 +63,9 @@ protected:
friend class wxTCPServer; friend class wxTCPServer;
friend class wxTCPClient; friend class wxTCPClient;
friend void Client_OnRequest(wxSocketBase&, friend void Client_OnRequest(wxSocketBase&,
GSocketEvent, char *); wxSocketNotify, char *);
friend void Server_OnRequest(wxSocketServer&, friend void Server_OnRequest(wxSocketServer&,
GSocketEvent, char *); wxSocketNotify, char *);
public: public:
wxTCPConnection(char *buffer, int size); wxTCPConnection(char *buffer, int size);

View File

@@ -33,6 +33,43 @@
#include "wx/sckaddr.h" #include "wx/sckaddr.h"
#include "wx/gsocket.h" #include "wx/gsocket.h"
// ------------------------------------------------------------------------
// GSocket type alias
// ------------------------------------------------------------------------
typedef enum {
wxSOCKET_INPUT = GSOCK_INPUT,
wxSOCKET_OUTPUT = GSOCK_OUTPUT,
wxSOCKET_CONNECTION = GSOCK_CONNECTION,
wxSOCKET_LOST = GSOCK_LOST
} wxSocketNotify;
enum {
wxSOCKET_INPUT_FLAG = GSOCK_INPUT_FLAG,
wxSOCKET_OUTPUT_FLAG = GSOCK_OUTPUT_FLAG,
wxSOCKET_CONNECTION_FLAG = GSOCK_CONNECTION_FLAG,
wxSOCKET_LOST_FLAG = GSOCK_LOST_FLAG,
};
typedef GSocketEventFlags wxSocketEventFlags;
typedef enum {
wxSOCKET_NOERROR = GSOCK_NOERROR,
wxSOCKET_INPOP = GSOCK_INVOP,
wxSOCKET_IOERR = GSOCK_IOERR,
wxSOCKET_INVADDR = GSOCK_INVADDR,
wxSOCKET_INVSOCK = GSOCK_INVSOCK,
wxSOCKET_NOHOST = GSOCK_NOHOST,
wxSOCKET_INVPORT = GSOCK_INVPORT,
wxSOCKET_WOULDBLOCK = GSOCK_WOULDBLOCK,
wxSOCKET_TIMEOUT = GSOCK_TIMEOUT,
wxSOCKET_MEMERR = GSOCK_MEMERR
} wxSocketError;
// ------------------------------------------------------------------------
// wxSocket base
// ------------------------------------------------------------------------
class WXDLLEXPORT wxTimer; class WXDLLEXPORT wxTimer;
class WXDLLEXPORT wxSocketEvent; class WXDLLEXPORT wxSocketEvent;
class WXDLLEXPORT wxSocketBase : public wxEvtHandler class WXDLLEXPORT wxSocketBase : public wxEvtHandler
@@ -45,7 +82,7 @@ public:
// Type of request // Type of request
enum wxSockType { SOCK_CLIENT, SOCK_SERVER, SOCK_INTERNAL, SOCK_UNINIT }; enum wxSockType { SOCK_CLIENT, SOCK_SERVER, SOCK_INTERNAL, SOCK_UNINIT };
typedef void (*wxSockCbk)(wxSocketBase& sock,GSocketEvent evt,char *cdata); typedef void (*wxSockCbk)(wxSocketBase& sock,wxSocketNotify evt,char *cdata);
protected: protected:
GSocket *m_socket; // wxSocket socket GSocket *m_socket; // wxSocket socket
@@ -103,7 +140,7 @@ public:
inline bool IsNoWait() const { return ((m_flags & NOWAIT) != 0); }; inline bool IsNoWait() const { return ((m_flags & NOWAIT) != 0); };
bool IsData() const; bool IsData() const;
inline size_t LastCount() const { return m_lcount; } inline size_t LastCount() const { return m_lcount; }
inline GSocketError LastError() const { return GSocket_GetError(m_socket); } inline wxSocketError LastError() const { return (wxSocketError)GSocket_GetError(m_socket); }
inline wxSockType GetType() const { return m_type; } inline wxSockType GetType() const { return m_type; }
void SetFlags(wxSockFlags _flags); void SetFlags(wxSockFlags _flags);
@@ -130,11 +167,11 @@ public:
void SetEventHandler(wxEvtHandler& evt_hdlr, int id = -1); void SetEventHandler(wxEvtHandler& evt_hdlr, int id = -1);
// Method called when it happens something on the socket // Method called when it happens something on the socket
void SetNotify(GSocketEventFlags flags); void SetNotify(wxSocketEventFlags flags);
virtual void OnRequest(GSocketEvent req_evt); virtual void OnRequest(wxSocketNotify req_evt);
// Public internal callback // Public internal callback
virtual void OldOnNotify(GSocketEvent WXUNUSED(evt)); virtual void OldOnNotify(wxSocketNotify WXUNUSED(evt));
// Some info on the socket... // Some info on the socket...
virtual bool GetPeer(wxSockAddress& addr_man) const; virtual bool GetPeer(wxSockAddress& addr_man) const;
@@ -144,9 +181,9 @@ public:
void Notify(bool notify); void Notify(bool notify);
// So you can know what the socket driver is looking for ... // So you can know what the socket driver is looking for ...
inline GSocketEventFlags NeededReq() const { return m_neededreq; } inline wxSocketEventFlags NeededReq() const { return m_neededreq; }
static GSocketEventFlags EventToNotify(GSocketEvent evt); static wxSocketEventFlags EventToNotify(wxSocketNotify evt);
protected: protected:
friend class wxSocketServer; friend class wxSocketServer;
@@ -202,7 +239,7 @@ public:
bool WaitOnConnect(long seconds = -1, long microseconds = 0); bool WaitOnConnect(long seconds = -1, long microseconds = 0);
virtual void OnRequest(GSocketEvent flags); virtual void OnRequest(wxSocketNotify flags);
}; };
class WXDLLEXPORT wxSocketEvent : public wxEvent { class WXDLLEXPORT wxSocketEvent : public wxEvent {
@@ -210,7 +247,7 @@ class WXDLLEXPORT wxSocketEvent : public wxEvent {
public: public:
wxSocketEvent(int id = 0); wxSocketEvent(int id = 0);
GSocketEvent SocketEvent() const { return m_skevt; } wxSocketNotify SocketEvent() const { return (wxSocketNotify)m_skevt; }
wxSocketBase *Socket() const { return m_socket; } wxSocketBase *Socket() const { return m_socket; }
void CopyObject(wxObject& obj_d) const; void CopyObject(wxObject& obj_d) const;

View File

@@ -281,7 +281,7 @@ void MyFrame::OnExecTest1(wxCommandEvent& WXUNUSED(evt))
/* No 2 */ /* No 2 */
sock->SetEventHandler(*this, SKDEMO_SCK); sock->SetEventHandler(*this, SKDEMO_SCK);
sock->SetNotify(GSOCK_INPUT | GSOCK_LOST); sock->SetNotify(GSOCK_INPUT_FLAG | GSOCK_LOST_FLAG);
sock->Notify(TRUE); sock->Notify(TRUE);
text_win->WriteText("Test 1B: sending bytes to the server\n"); text_win->WriteText("Test 1B: sending bytes to the server\n");

View File

@@ -60,10 +60,10 @@ enum {
#endif #endif
void Server_OnRequest(wxSocketServer& server, void Server_OnRequest(wxSocketServer& server,
GSocketEvent evt, wxSocketNotify evt,
char *cdata); char *cdata);
void Client_OnRequest(wxSocketBase& sock, void Client_OnRequest(wxSocketBase& sock,
GSocketEvent evt, wxSocketNotify evt,
char *cdata); char *cdata);
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
@@ -96,7 +96,7 @@ wxConnectionBase *wxTCPClient::MakeConnection (const wxString& host,
wxDataInputStream data_is(*stream); wxDataInputStream data_is(*stream);
wxDataOutputStream data_os(*stream); wxDataOutputStream data_os(*stream);
client->SetNotify(GSOCK_INPUT_FLAG | GSOCK_LOST_FLAG); client->SetNotify(wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG);
addr.Service(server_name); addr.Service(server_name);
addr.Hostname(host); addr.Hostname(host);
@@ -162,7 +162,7 @@ bool wxTCPServer::Create(const wxString& server_name)
// Create a socket listening on specified port // Create a socket listening on specified port
server = new wxSocketServer(addr); server = new wxSocketServer(addr);
server->Callback((wxSocketBase::wxSockCbk)Server_OnRequest); server->Callback((wxSocketBase::wxSockCbk)Server_OnRequest);
server->SetNotify(GSOCK_CONNECTION_FLAG); server->SetNotify(wxSOCKET_CONNECTION_FLAG);
server->CallbackData((char *)this); server->CallbackData((char *)this);
@@ -336,7 +336,7 @@ bool wxTCPConnection::Advise (const wxString& item,
return TRUE; return TRUE;
} }
void Client_OnRequest(wxSocketBase& sock, GSocketEvent evt, void Client_OnRequest(wxSocketBase& sock, wxSocketNotify evt,
char *cdata) char *cdata)
{ {
int msg = 0; int msg = 0;
@@ -348,7 +348,7 @@ void Client_OnRequest(wxSocketBase& sock, GSocketEvent evt,
wxString item; wxString item;
// The socket handler signals us that we lost the connection: destroy all. // The socket handler signals us that we lost the connection: destroy all.
if (evt == GSOCK_LOST) { if (evt == wxSOCKET_LOST) {
sock.Close(); sock.Close();
connection->OnDisconnect(); connection->OnDisconnect();
return; return;
@@ -464,20 +464,20 @@ void Client_OnRequest(wxSocketBase& sock, GSocketEvent evt,
} }
void Server_OnRequest(wxSocketServer& server, void Server_OnRequest(wxSocketServer& server,
GSocketEvent evt, char *cdata) wxSocketNotify evt, char *cdata)
{ {
wxTCPServer *ipcserv = (wxTCPServer *)cdata; wxTCPServer *ipcserv = (wxTCPServer *)cdata;
wxSocketStream *stream; wxSocketStream *stream;
wxDataInputStream *codeci; wxDataInputStream *codeci;
wxDataOutputStream *codeco; wxDataOutputStream *codeco;
if (evt != GSOCK_CONNECTION) if (evt != wxSOCKET_CONNECTION)
return; return;
/* Accept the connection, getting a new socket */ /* Accept the connection, getting a new socket */
wxSocketBase *sock = server.Accept(); wxSocketBase *sock = server.Accept();
sock->Notify(FALSE); sock->Notify(FALSE);
sock->SetNotify(GSOCK_INPUT_FLAG | GSOCK_LOST_FLAG); sock->SetNotify(wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG);
stream = new wxSocketStream(*sock); stream = new wxSocketStream(*sock);
codeci = new wxDataInputStream(*stream); codeci = new wxDataInputStream(*stream);

View File

@@ -637,7 +637,7 @@ bool wxSocketBase::WaitForLost(long seconds, long milliseconds)
// --------- wxSocketBase callback management ------------------- // --------- wxSocketBase callback management -------------------
// -------------------------------------------------------------- // --------------------------------------------------------------
GSocketEventFlags wxSocketBase::EventToNotify(GSocketEvent evt) wxSocketEventFlags wxSocketBase::EventToNotify(wxSocketNotify evt)
{ {
switch (evt) switch (evt)
{ {
@@ -665,7 +665,7 @@ wxSocketBase::wxSockFlags wxSocketBase::GetFlags() const
return m_flags; return m_flags;
} }
void wxSocketBase::SetNotify(GSocketEventFlags flags) void wxSocketBase::SetNotify(wxSocketEventFlags flags)
{ {
/* Check if server */ /* Check if server */
if (m_type != SOCK_SERVER) if (m_type != SOCK_SERVER)
@@ -686,7 +686,7 @@ static void wx_socket_fallback(GSocket *socket, GSocketEvent event, char *cdata)
{ {
wxSocketBase *sckobj = (wxSocketBase *)cdata; wxSocketBase *sckobj = (wxSocketBase *)cdata;
sckobj->OnRequest(event); sckobj->OnRequest((wxSocketNotify)event);
} }
void wxSocketBase::Notify(bool notify) void wxSocketBase::Notify(bool notify)
@@ -703,28 +703,28 @@ void wxSocketBase::Notify(bool notify)
GSocket_SetCallback(m_socket, m_neededreq, wx_socket_fallback, (char *)this); GSocket_SetCallback(m_socket, m_neededreq, wx_socket_fallback, (char *)this);
} }
void wxSocketBase::OnRequest(GSocketEvent req_evt) void wxSocketBase::OnRequest(wxSocketNotify req_evt)
{ {
wxSocketEvent event(m_id); wxSocketEvent event(m_id);
GSocketEventFlags notify = EventToNotify(req_evt); GSocketEventFlags notify = EventToNotify(req_evt);
if (m_defering != NO_DEFER) { if (m_defering != NO_DEFER) {
DoDefer(req_evt); DoDefer((GSocketEvent)req_evt);
return; return;
} }
if ((m_neededreq & notify) == notify) { if ((m_neededreq & notify) == notify) {
event.m_socket = this; event.m_socket = this;
event.m_skevt = req_evt; event.m_skevt = (GSocketEvent) req_evt;
ProcessEvent(event); ProcessEvent(event);
OldOnNotify(req_evt); OldOnNotify(req_evt);
} }
if (req_evt == GSOCK_LOST) if ((GSocketEvent)req_evt == GSOCK_LOST)
Close(); Close();
} }
void wxSocketBase::OldOnNotify(GSocketEvent evt) void wxSocketBase::OldOnNotify(wxSocketNotify evt)
{ {
} }
@@ -913,9 +913,9 @@ bool wxSocketClient::WaitOnConnect(long seconds, long microseconds)
return m_connected; return m_connected;
} }
void wxSocketClient::OnRequest(GSocketEvent evt) void wxSocketClient::OnRequest(wxSocketNotify evt)
{ {
if (evt == GSOCK_CONNECTION) if ((GSocketEvent)evt == GSOCK_CONNECTION)
{ {
if (m_connected) if (m_connected)
{ {

View File

@@ -19,16 +19,10 @@ void _GSocket_GDK_Input(gpointer data, gint source, GdkInputCondition condition)
{ {
GSocket *socket = (GSocket *)data; GSocket *socket = (GSocket *)data;
switch (condition) { if (condition & GDK_INPUT_READ)
case GDK_INPUT_READ:
_GSocket_Detected_Read(socket); _GSocket_Detected_Read(socket);
break; if (condition & GDK_INPUT_WRITE)
case GDK_INPUT_WRITE:
_GSocket_Detected_Write(socket); _GSocket_Detected_Write(socket);
break;
default:
break;
}
} }
void _GSocket_GUI_Init(GSocket *socket) void _GSocket_GUI_Init(GSocket *socket)

View File

@@ -19,16 +19,10 @@ void _GSocket_GDK_Input(gpointer data, gint source, GdkInputCondition condition)
{ {
GSocket *socket = (GSocket *)data; GSocket *socket = (GSocket *)data;
switch (condition) { if (condition & GDK_INPUT_READ)
case GDK_INPUT_READ:
_GSocket_Detected_Read(socket); _GSocket_Detected_Read(socket);
break; if (condition & GDK_INPUT_WRITE)
case GDK_INPUT_WRITE:
_GSocket_Detected_Write(socket); _GSocket_Detected_Write(socket);
break;
default:
break;
}
} }
void _GSocket_GUI_Init(GSocket *socket) void _GSocket_GUI_Init(GSocket *socket)

View File

@@ -77,7 +77,7 @@ bool wxSoundWave::CanRead()
return TRUE; return TRUE;
} }
bool wxSoundWave::HandlePCM(wxDataInputStream& data, wxUint16 channels, bool wxSoundWave::HandleOutputPCM(wxDataInputStream& data, wxUint16 channels,
wxUint32 sample_fq, wxUint32 byte_p_sec, wxUint32 sample_fq, wxUint32 byte_p_sec,
wxUint16 byte_p_spl, wxUint16 bits_p_spl) wxUint16 byte_p_spl, wxUint16 bits_p_spl)
{ {
@@ -95,7 +95,7 @@ bool wxSoundWave::HandlePCM(wxDataInputStream& data, wxUint16 channels,
return TRUE; return TRUE;
} }
bool wxSoundWave::HandleG721(wxDataInputStream& data, wxUint16 channels, bool wxSoundWave::HandleOutputG721(wxDataInputStream& data, wxUint16 channels,
wxUint32 sample_fq, wxUint32 byte_p_sec, wxUint32 sample_fq, wxUint32 byte_p_sec,
wxUint16 byte_p_spl, wxUint16 bits_p_spl) wxUint16 byte_p_spl, wxUint16 bits_p_spl)
{ {
@@ -152,12 +152,12 @@ bool wxSoundWave::PrepareToPlay()
switch (format) { switch (format) {
case 0x01: case 0x01:
if (!HandlePCM(data, channels, sample_fq, if (!HandleOutputPCM(data, channels, sample_fq,
byte_p_sec, byte_p_spl, bits_p_spl)) byte_p_sec, byte_p_spl, bits_p_spl))
return FALSE; return FALSE;
break; break;
case 0x40: case 0x40:
if (!HandleG721(data, channels, sample_fq, if (!HandleOutputG721(data, channels, sample_fq,
byte_p_sec, byte_p_spl, bits_p_spl)) byte_p_sec, byte_p_spl, bits_p_spl))
return FALSE; return FALSE;
break; break;
@@ -178,6 +178,60 @@ bool wxSoundWave::PrepareToPlay()
return TRUE; return TRUE;
} }
wxSoundFormatBase *wxSoundWave::HandleInputPCM(wxDataOutputStream& data)
{
wxUint16 format, channels, byte_p_spl, bits_p_spl;
wxUint32 sample_fq, byte_p_sec;
wxSoundFormatPcm *pcm;
pcm = (wxSoundFormatPcm *)(m_sndformat->Clone());
// Write block length
data.Write32(16);
sample_fq = pcm->GetSampleRate();
bits_p_spl = pcm->GetBPS();
channels = pcm->GetChannels();
byte_p_spl = pcm->GetBPS() / 8;
byte_p_sec = pcm->GetBytesFromTime(1);
format = 0x01;
pcm->Signed(TRUE);
pcm->SetOrder(wxLITTLE_ENDIAN);
data << format << channels << sample_fq
<< byte_p_sec << byte_p_spl << bits_p_spl;
return pcm;
}
wxSoundFormatBase *wxSoundWave::HandleInputG72X(wxDataOutputStream& data)
{
wxUint16 format, channels, byte_p_spl, bits_p_spl;
wxUint32 sample_fq, byte_p_sec;
wxSoundFormatG72X *g72x;
// Write block length
data.Write32(16);
g72x = (wxSoundFormatG72X *)(m_sndformat->Clone());
if (g72x->GetG72XType() != wxSOUND_G721) {
delete g72x;
return NULL;
}
sample_fq = g72x->GetSampleRate();
bits_p_spl = 4;
channels = 1;
byte_p_spl = 0;
byte_p_sec = g72x->GetBytesFromTime(1);
format = 0x40;
data << format << channels << sample_fq
<< byte_p_sec << byte_p_spl << bits_p_spl;
return g72x;
}
bool wxSoundWave::PrepareToRecord(unsigned long time) bool wxSoundWave::PrepareToRecord(unsigned long time)
{ {
#define WRITE_SIGNATURE(sig) \ #define WRITE_SIGNATURE(sig) \
@@ -207,38 +261,30 @@ FAIL_WITH(m_output->Write(&signature, 4).LastWrite() != 4, wxSOUND_INVSTRM);
WRITE_SIGNATURE(WAVE_SIGNATURE); WRITE_SIGNATURE(WAVE_SIGNATURE);
{ {
wxUint16 format, channels, byte_p_spl, bits_p_spl; wxSoundFormatBase *frmt;
wxUint32 sample_fq, byte_p_sec;
wxSoundFormatPcm *pcm;
if (m_sndformat->GetType() != wxSOUND_PCM) { WRITE_SIGNATURE(FMT_SIGNATURE);
switch (m_sndformat->GetType()) {
case wxSOUND_PCM:
frmt = HandleInputPCM(data);
break;
case wxSOUND_G72X:
frmt = HandleInputG72X(data);
break;
default:
m_snderror = wxSOUND_NOCODEC; m_snderror = wxSOUND_NOCODEC;
return FALSE; return FALSE;
} }
pcm = (wxSoundFormatPcm *)(m_sndformat->Clone()); FAIL_WITH(!frmt, wxSOUND_NOCODEC);
WRITE_SIGNATURE(FMT_SIGNATURE); if (!SetSoundFormat(*frmt)) {
data.Write32(16); delete frmt;
sample_fq = pcm->GetSampleRate();
bits_p_spl = pcm->GetBPS();
channels = pcm->GetChannels();
byte_p_spl = pcm->GetBPS() / 8;
byte_p_sec = pcm->GetBytesFromTime(1);
format = 1;
data << format << channels << sample_fq
<< byte_p_sec << byte_p_spl << bits_p_spl;
pcm->Signed(TRUE);
pcm->SetOrder(wxLITTLE_ENDIAN);
if (!SetSoundFormat(*pcm)) {
delete pcm;
return FALSE; return FALSE;
} }
delete pcm; delete frmt;
} }
WRITE_SIGNATURE(DATA_SIGNATURE); WRITE_SIGNATURE(DATA_SIGNATURE);

View File

@@ -39,12 +39,14 @@ class wxSoundWave: public wxSoundFileStream {
wxUint32 GetData(void *buffer, wxUint32 len); wxUint32 GetData(void *buffer, wxUint32 len);
wxUint32 PutData(const void *buffer, wxUint32 len); wxUint32 PutData(const void *buffer, wxUint32 len);
bool HandlePCM(wxDataInputStream& data, wxUint16 channels, bool HandleOutputPCM(wxDataInputStream& data, wxUint16 channels,
wxUint32 sample_fq, wxUint32 byte_p_sec, wxUint32 sample_fq, wxUint32 byte_p_sec,
wxUint16 byte_p_spl, wxUint16 bits_p_spl); wxUint16 byte_p_spl, wxUint16 bits_p_spl);
bool HandleG721(wxDataInputStream& data, wxUint16 channels, bool HandleOutputG721(wxDataInputStream& data, wxUint16 channels,
wxUint32 sample_fq, wxUint32 byte_p_sec, wxUint32 sample_fq, wxUint32 byte_p_sec,
wxUint16 byte_p_spl, wxUint16 bits_p_spl); wxUint16 byte_p_spl, wxUint16 bits_p_spl);
wxSoundFormatBase *HandleInputPCM(wxDataOutputStream& data);
wxSoundFormatBase *HandleInputG72X(wxDataOutputStream& data);
}; };
#endif #endif