Skip to content

Commit 138bfdd

Browse files
author
-
committed
modify example code to be self-sufficient, and compile without changes
1 parent 3dd0c44 commit 138bfdd

File tree

1 file changed

+90
-70
lines changed

1 file changed

+90
-70
lines changed

include/cubeb/cubeb.h

Lines changed: 90 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -29,93 +29,113 @@ extern "C" {
2929
to the speakers, with minimal latency and the proper sample-rate for the
3030
platform.
3131
32-
@code
33-
cubeb * app_ctx;
34-
cubeb_init(&app_ctx, "Example Application", NULL);
35-
int rv;
36-
uint32_t rate;
37-
uint32_t latency_frames;
38-
uint64_t ts;
39-
40-
rv = cubeb_get_preferred_sample_rate(app_ctx, &rate);
41-
if (rv != CUBEB_OK) {
42-
fprintf(stderr, "Could not get preferred sample-rate");
43-
return rv;
44-
}
45-
46-
cubeb_stream_params output_params;
47-
output_params.format = CUBEB_SAMPLE_FLOAT32NE;
48-
output_params.rate = rate;
49-
output_params.channels = 2;
50-
output_params.layout = CUBEB_LAYOUT_UNDEFINED;
51-
output_params.prefs = CUBEB_STREAM_PREF_NONE;
52-
53-
rv = cubeb_get_min_latency(app_ctx, &output_params, &latency_frames);
54-
if (rv != CUBEB_OK) {
55-
fprintf(stderr, "Could not get minimum latency");
56-
return rv;
57-
}
58-
59-
cubeb_stream_params input_params;
60-
input_params.format = CUBEB_SAMPLE_FLOAT32NE;
61-
input_params.rate = rate;
62-
input_params.channels = 1;
63-
input_params.layout = CUBEB_LAYOUT_UNDEFINED;
64-
input_params.prefs = CUBEB_STREAM_PREF_NONE;
65-
66-
cubeb_stream * stm;
67-
rv = cubeb_stream_init(app_ctx, &stm, "Example Stream 1",
68-
NULL, &input_params,
69-
NULL, &output_params,
70-
latency_frames,
71-
data_cb, state_cb,
72-
NULL);
73-
if (rv != CUBEB_OK) {
74-
fprintf(stderr, "Could not open the stream");
75-
return rv;
76-
}
77-
78-
rv = cubeb_stream_start(stm);
79-
if (rv != CUBEB_OK) {
80-
fprintf(stderr, "Could not start the stream");
81-
return rv;
82-
}
83-
for (;;) {
84-
cubeb_stream_get_position(stm, &ts);
85-
printf("time=%llu\n", ts);
86-
sleep(1);
87-
}
88-
rv = cubeb_stream_stop(stm);
89-
if (rv != CUBEB_OK) {
90-
fprintf(stderr, "Could not stop the stream");
91-
return rv;
92-
}
93-
94-
cubeb_stream_destroy(stm);
95-
cubeb_destroy(app_ctx);
96-
@endcode
32+
If you receive "Could not open the stream", you likely do not have a
33+
microphone. In that case, change PIPE_INPUT_TO_OUTPUT from true to false.
9734
9835
@code
36+
#include "stdio.h"
37+
#include "cubeb/cubeb.h"
38+
#ifdef _WIN32
39+
#define WIN32_LEAN_AND_MEAN
40+
#include <Windows.h>
41+
#include <Objbase.h>
42+
#else
43+
#include <unistd.h>
44+
#endif
45+
#define PIPE_INPUT_TO_OUTPUT true
46+
9947
long data_cb(cubeb_stream * stm, void * user,
10048
const void * input_buffer, void * output_buffer, long nframes)
10149
{
102-
const float * in = input_buffer;
103-
float * out = output_buffer;
104-
50+
const float * in = (float *)input_buffer;
51+
float * out = (float *)output_buffer;
10552
for (int i = 0; i < nframes; ++i) {
10653
for (int c = 0; c < 2; ++c) {
54+
#if PIPE_INPUT_TO_OUTPUT
10755
out[2 * i + c] = in[i];
56+
#else
57+
out[2 * i + c] = (float)((i * 123) % 200) / 10000.f;
58+
#endif
10859
}
10960
}
11061
return nframes;
11162
}
112-
@endcode
11363
114-
@code
11564
void state_cb(cubeb_stream * stm, void * user, cubeb_state state)
11665
{
11766
printf("state=%d\n", state);
11867
}
68+
69+
70+
int main() {
71+
#if _WIN32
72+
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
73+
#endif
74+
cubeb * app_ctx;
75+
cubeb_init(&app_ctx, "Example Application", NULL);
76+
int rv;
77+
uint32_t rate;
78+
uint32_t latency_frames;
79+
uint64_t ts;
80+
rv = cubeb_get_preferred_sample_rate(app_ctx, &rate);
81+
if (rv != CUBEB_OK) {
82+
fprintf(stderr, "Could not get preferred sample-rate");
83+
return rv;
84+
}
85+
cubeb_stream_params output_params;
86+
output_params.format = CUBEB_SAMPLE_FLOAT32NE;
87+
output_params.rate = rate;
88+
output_params.channels = 2;
89+
output_params.layout = CUBEB_LAYOUT_UNDEFINED;
90+
output_params.prefs = CUBEB_STREAM_PREF_NONE;
91+
rv = cubeb_get_min_latency(app_ctx, &output_params, &latency_frames);
92+
if (rv != CUBEB_OK) {
93+
fprintf(stderr, "Could not get minimum latency");
94+
return rv;
95+
}
96+
cubeb_stream_params input_params;
97+
input_params.format = CUBEB_SAMPLE_FLOAT32NE;
98+
input_params.rate = rate;
99+
input_params.channels = 1;
100+
input_params.layout = CUBEB_LAYOUT_UNDEFINED;
101+
input_params.prefs = CUBEB_STREAM_PREF_NONE;
102+
cubeb_stream * stm;
103+
rv = cubeb_stream_init(app_ctx, &stm, "Example Stream 1",
104+
#if PIPE_INPUT_TO_OUTPUT
105+
NULL, &input_params,
106+
#else
107+
NULL, NULL,
108+
#endif
109+
NULL, &output_params,
110+
latency_frames,
111+
data_cb, state_cb,
112+
NULL);
113+
if (rv != CUBEB_OK) {
114+
fprintf(stderr, "Could not open the stream");
115+
return rv;
116+
}
117+
rv = cubeb_stream_start(stm);
118+
if (rv != CUBEB_OK) {
119+
fprintf(stderr, "Could not start the stream");
120+
return rv;
121+
}
122+
for (;;) {
123+
cubeb_stream_get_position(stm, &ts);
124+
printf("time=%llu\n", ts);
125+
#if _WIN32
126+
Sleep(1);
127+
#else
128+
sleep(1);
129+
#endif
130+
}
131+
rv = cubeb_stream_stop(stm);
132+
if (rv != CUBEB_OK) {
133+
fprintf(stderr, "Could not stop the stream");
134+
return rv;
135+
}
136+
cubeb_stream_destroy(stm);
137+
cubeb_destroy(app_ctx);
138+
}
119139
@endcode
120140
*/
121141

0 commit comments

Comments
 (0)