From: Larry on
[C++] Bounded Buffer(s)

Hi,

I am writing a little application to capture audio data from a wavein
device and broadcast it to the

internet over http protocol. My application is basically divided into two
segments:

Capturing Thread:
-> waveCapture // waveCapture.h (class)
-> mp3Encoding // mp3Encoder.h (class)

Broadcasting Thread:
-> httpServer // httpServer (class)

So in a nutshell, the capturing thread is the "Producer" and the
broadcasting thread is the "Consumer".

In order to link them I need to code a buffer. The producer will put data on
it whereas the consumer will

retrieve data from it.

I would like to post some code about the server (barebones) so I can get to
the main point later on:

unsigned int __stdcall handleClient(void* a)
{
Socket* s = (Socket*) a;
while(1)
{
string r = s->ReceiveLine();
if (r.empty())
break;

s->SendLine("Hello, I am the server!");
break;
}

// Disconnect
s->close();

delete s;
return 0;
}

int main()
{
// Server: set up
SocketServer in(8000,5);

while(1)
{
// Server: wait for incoming connections
Socket* s=in.Accept();
cout << "a client connected..." << endl;

// Server: spawn a new thread to deal with the client
unsigned int ret;
_beginthreadex(0,0,handleClient,s,0,&ret);
}

system("pause");
return EXIT_SUCCESS;
}

As you can see, the server waits for incoming connections and spawns a
thread to deal with a single client each time it connects.

Now, in the handleClient() thread I should retrieve data from the buffer
(being written by the "producer") and send it to the client...

Here comes the pain! Since I have to deal with several connections at the
same time I don't know if they should read from one single buffer or
something else...for instance the producer should write to severl instances
of the buffer...

any idea how I should work this out?

thanks

From: Tim Roberts on
"Larry" <dontmewithme(a)got.it> wrote:
>
> I am writing a little application to capture audio data from a wavein
>device and broadcast it to the internet over http protocol. My application
>is basically divided into two segments:

You know, RTSP and RTP were designed for exactly this kind of thing.
There's no point in reinventing the wheel here.

>As you can see, the server waits for incoming connections and spawns a
>thread to deal with a single client each time it connects.
>
>Now, in the handleClient() thread I should retrieve data from the buffer
>(being written by the "producer") and send it to the client...
>
>Here comes the pain! Since I have to deal with several connections at the
>same time I don't know if they should read from one single buffer or
>something else...for instance the producer should write to severl instances
>of the buffer...

This depends on how you want to handle network latencies. In my view, you
would have one single buffer, with one producer and multiple consumers. You
just have to make sure you handle the case where one consumer gets behind
and the buffer pointers wrap around.
--
Tim Roberts, timr(a)probo.com
Providenza & Boekelheide, Inc.