Discussion:
HTTP1.1 chunked encoding - stream audio data
channa reddy patil
2017-04-27 19:15:11 UTC
Permalink
I have a question regarding if we can use curl to stream live audio captured from the MIC device. The problem I am facing is, the server is responding back immediately after the first chunk since it receives a end of chunk frame. Below are the steps I want to do1. read MIC device some bytes to a buffer2. Pass the buffer to curl to send it as chunked data3. repeat step-1 again. Basically I do not want curl to send the end of with the transfer of the first buffer-Channa
Ray Satiro via curl-users
2017-04-28 05:01:02 UTC
Permalink
Post by channa reddy patil
I have a question regarding if we can use curl to stream live audio
captured from the MIC device.
The problem I am facing is, the server is responding back immediately
after the first chunk since it receives a end of chunk frame. Below
are the steps I want to do
1. read MIC device some bytes to a buffer
2. Pass the buffer to curl to send it as chunked data
3. repeat step-1 again.
Basically I do not want curl to send the end of with the transfer of
the first buffer
If the server will wait then yes. You can pause the stream by returning
CURL_READFUNC_PAUSE [1] from your read function instead of 0. You can
use the progress callback [2][3][4] to check whether more uldata is
available and to unpause [5]. Note the progress function is called quite
frequently, at least once per second, so do as little processing there
as possible.

I actually can't find I've done this so I don't have a working sample
for you. I'm going to take a shot at how I think it would look but I'd
wait a bit in case someone more experienced in this area says it's wrong:

For each handle have a variable last_pause that tracks the handle's
pause state. Set it to 0 before calling perform on the handle, and then
during perform set it to the pause state you set with curl_easy_pause or
return from read function with CURL_READFUNC_PAUSE (last_pause |=
CURLPAUSE_SEND) or from write function with CURL_WRITEFUNC_PAUSE
(last_pause |= CURLPAUSE_RECV).

uldata_available represents some way you determine if upload data is
available.

Beginning of read function:
if(!userp->uldata_available) {
userp->last_pause |= CURLPAUSE_SEND;
return CURL_READFUNC_PAUSE;
}

Beginning of progress function:
if((userp->last_pause & CURLPAUSE_SEND) && userp->uldata_available) {
userp->last_pause &= ~CURLPAUSE_SEND;
res = curl_easy_pause(userp->handle, userp->last_pause);
if(res != CURLE_OK)
return (int)res;
}


[1]: https://curl.haxx.se/libcurl/c/CURLOPT_READFUNCTION.html
[2]: https://curl.haxx.se/libcurl/c/CURLOPT_XFERINFOFUNCTION.html
[3]: https://curl.haxx.se/libcurl/c/CURLOPT_NOPROGRESS.html
[4]: https://curl.haxx.se/libcurl/c/CURLOPT_XFERINFODATA.html
[5]: https://curl.haxx.se/libcurl/c/curl_easy_pause.html



-----------------------------------------------------------
Unsubscribe: https://cool.haxx.se/list/listinfo/curl-users
Etiq
channa reddy patil
2017-05-03 16:30:29 UTC
Permalink
Thank you for your response. I am trying to do something similar to what you explained. But I see that curl_easy_perform does not return at all even if I return CURL_READFUNC_PAUSE. I want curl_easy_perform to return every time so that I can check if there was something in response from the server to the transfer that was done. And based on if there was a reponse and type of response I either want to resume sending data or otherwise.From: Ray Satiro via curl-users <curl-***@cool.haxx.se>Sent: Fri, 28 Apr 2017 10:40:13 To: curl-***@cool.haxx.seCc: Ray Satiro <***@yahoo.com>Subject: Re: HTTP1.1 chunked encoding - stream audio dataOn 4/27/2017 3:15 PM, channa reddy patil wrote:

> I have a question regarding if we can use curl to stream live audio

> captured from the MIC device.

> The problem I am facing is, the server is responding back immediately

> after the first chunk since it receives a end of chunk frame. Below

> are the steps I want to do

> 1. read MIC device some bytes to a buffer

> 2. Pass the buffer to curl to send it as chunked data

> 3. repeat step-1 again.

> Basically I do not want curl to send the end of with the transfer of

> the first buffer



If the server will wait then yes. You can pause the stream by returning

CURL_READFUNC_PAUSE [1] from your read function instead of 0. You can

use the progress callback [2][3][4] to check whether more uldata is

available and to unpause [5]. Note the progress function is called quite

frequently, at least once per second, so do as little processing there

as possible.



I actually can't find I've done this so I don't have a working sample

for you. I'm going to take a shot at how I think it would look but I'd

wait a bit in case someone more experienced in this area says it's wrong:



For each handle have a variable last_pause that tracks the handle's

pause state. Set it to 0 before calling perform on the handle, and then

during perform set it to the pause state you set with curl_easy_pause or

return from read function with CURL_READFUNC_PAUSE (last_pause |=

CURLPAUSE_SEND) or from write function with CURL_WRITEFUNC_PAUSE

(last_pause |= CURLPAUSE_RECV).



uldata_available represents some way you determine if upload data is

available.



Beginning of read function:

if(!userp->uldata_available) {

 userp->last_pause |= CURLPAUSE_SEND;

 return CURL_READFUNC_PAUSE;

}



Beginning of progress function:

if((userp->last_pause & CURLPAUSE_SEND) && userp->uldata_available) {

 userp->last_pause &= ~CURLPAUSE_SEND;

 res = curl_easy_pause(userp->handle, userp->last_pause);

 if(res != CURLE_OK)

   return (int)res;

}





[1]: https://curl.haxx.se/libcurl/c/CURLOPT_READFUNCTION.html

[2]: https://curl.haxx.se/libcurl/c/CURLOPT_XFERINFOFUNCTION.html

[3]: https://curl.haxx.se/libcurl/c/CURLOPT_NOPROGRESS.html

[4]: https://curl.haxx.se/libcurl/c/CURLOPT_XFERINFODATA.html

[5]: https://curl.haxx.se/libcurl/c/curl_easy_pause.html







-----------------------------------------------------------

Unsubscribe: https://cool.haxx.se/list/listinfo/curl-users

Etiquette:   https://curl.haxx.se/mail/etiquette.html
Daniel Stenberg
2017-05-04 09:03:45 UTC
Permalink
On Wed, 3 May 2017, channa reddy patil wrote:

You're talking libcurl details and use. Please switch over to the curl-library
mailing list then, as that's the more proper list for that and where you'll
reach many more libcurl developers.
Post by channa reddy patil
I see that curl_easy_perform does not return at all even if I return
CURL_READFUNC_PAUSE. I want curl_easy_perform to return every time so that I
can check if there was something in response from the server to the transfer
that was done.
curl_easy_perform() is fully synchronous and will not return until the
transfer is done. Either successful or failed. If you need something
asynchronous, consider the multi interface.
--
/ daniel.haxx.se
-----------------------------------------------------------
Unsubscribe: https://cool.haxx.se/list/listinfo/curl-users
Etiquette: https://curl.haxx.se/
Loading...