/
playurl.c
71 lines (58 loc) · 1.62 KB
/
playurl.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <curl/curl.h>
#include <mpg123.h>
#include <ao/ao.h>
#define BITS 8
mpg123_handle *mh = NULL;
ao_device *dev = NULL;
size_t play_stream(void *buffer, size_t size, size_t nmemb, void *userp)
{
int err;
off_t frame_offset;
unsigned char *audio;
size_t done;
ao_sample_format format;
int channels, encoding;
long rate;
mpg123_feed(mh, (const unsigned char*) buffer, size * nmemb);
do {
err = mpg123_decode_frame(mh, &frame_offset, &audio, &done);
switch(err) {
case MPG123_NEW_FORMAT:
mpg123_getformat(mh, &rate, &channels, &encoding);
format.bits = mpg123_encsize(encoding) * BITS;
format.rate = rate;
format.channels = channels;
format.byte_format = AO_FMT_NATIVE;
format.matrix = 0;
dev = ao_open_live(ao_default_driver_id(), &format, NULL);
break;
case MPG123_OK:
ao_play(dev, audio, done);
break;
case MPG123_NEED_MORE:
break;
default:
break;
}
} while(done > 0);
return size * nmemb;
}
int main(int argc, char *argv[]){
if(argc < 2)
return 0;
ao_initialize();
mpg123_init();
mh = mpg123_new(NULL, NULL);
mpg123_open_feed(mh);
CURL *curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, play_stream);
curl_easy_setopt(curl, CURLOPT_URL, argv[1]);
curl_easy_perform(curl);
curl_easy_cleanup(curl);
mpg123_close(mh);
mpg123_delete(mh);
mpg123_exit();
ao_close(dev);
ao_shutdown();
return 0;
}