Skip to content

Commit b44b084

Browse files
committed
WIP: Add cubeb_stream_get_max_request_size API.
This is intended to support mozilla/audioipc#124
1 parent 07c352c commit b44b084

15 files changed

+55
-0
lines changed

include/cubeb/cubeb.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -607,6 +607,7 @@ cubeb_stream_get_latency(cubeb_stream * stream, uint32_t * latency);
607607
@retval CUBEB_ERROR */
608608
CUBEB_EXPORT int
609609
cubeb_stream_get_input_latency(cubeb_stream * stream, uint32_t * latency);
610+
610611
/** Set the volume for a stream.
611612
@param stream the stream for which to adjust the volume.
612613
@param volume a float between 0.0 (muted) and 1.0 (maximum volume)
@@ -637,6 +638,18 @@ CUBEB_EXPORT int
637638
cubeb_stream_get_current_device(cubeb_stream * stm,
638639
cubeb_device ** const device);
639640

641+
/** Get the maximum request size for this stream in frames. This is the largest
642+
value that will be presented or requested via `data_callback`'s `nframes` parameter.
643+
Note: This value may change if the stream is automatically reconfigured due to device changes.
644+
Callers of this API should use cubeb_stream_register_device_changed_callback to monitor
645+
device changes and requery this API after a device change.
646+
@param stream the stream for which to retrieve max request size.
647+
@param max_request_size the max request size in frames.
648+
@retval CUBEB_OK
649+
@retval CUBEB_ERROR_NOT_SUPPORTED */
650+
CUBEB_EXPORT int
651+
cubeb_stream_get_max_request_size(cubeb_stream * stream, uint32_t * max_request_size);
652+
640653
/** Destroy a cubeb_device structure.
641654
@param stream the stream passed in cubeb_stream_get_current_device
642655
@param devices the devices to destroy

src/cubeb-internal.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ struct cubeb_ops {
6666
int (*stream_register_device_changed_callback)(
6767
cubeb_stream * stream,
6868
cubeb_device_changed_callback device_changed_callback);
69+
int (*stream_get_max_request_size)(cubeb_stream * stream, uint32_t * max_request_size);
6970
int (*register_device_collection_changed)(
7071
cubeb * context, cubeb_device_type devtype,
7172
cubeb_device_collection_changed_callback callback, void * user_ptr);

src/cubeb.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,20 @@ cubeb_stream_get_current_device(cubeb_stream * stream,
500500
return stream->context->ops->stream_get_current_device(stream, device);
501501
}
502502

503+
int
504+
cubeb_stream_get_max_request_size(cubeb_stream * stream, uint32_t * max_request_size)
505+
{
506+
if (!stream || !max_request_size) {
507+
return CUBEB_ERROR_INVALID_PARAMETER;
508+
}
509+
510+
if (!stream->context->ops->stream_get_max_request_size) {
511+
return CUBEB_ERROR_NOT_SUPPORTED;
512+
}
513+
514+
return stream->context->ops->stream_get_max_request_size(stream, max_request_size);
515+
}
516+
503517
int
504518
cubeb_stream_device_destroy(cubeb_stream * stream, cubeb_device * device)
505519
{

src/cubeb_aaudio.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1460,6 +1460,7 @@ const static struct cubeb_ops aaudio_ops = {
14601460
/*.stream_get_current_device =*/NULL,
14611461
/*.stream_device_destroy =*/NULL,
14621462
/*.stream_register_device_changed_callback =*/NULL,
1463+
/*.stream_get_max_request_size =*/NULL,
14631464
/*.register_device_collection_changed =*/NULL};
14641465

14651466
extern "C" /*static*/ int

src/cubeb_alsa.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1487,4 +1487,5 @@ static struct cubeb_ops const alsa_ops = {
14871487
.stream_get_current_device = NULL,
14881488
.stream_device_destroy = NULL,
14891489
.stream_register_device_changed_callback = NULL,
1490+
.stream_get_max_request_size = NULL,
14901491
.register_device_collection_changed = NULL};

src/cubeb_audiounit.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3666,5 +3666,6 @@ cubeb_ops const audiounit_ops = {
36663666
/*.stream_device_destroy =*/audiounit_stream_device_destroy,
36673667
/*.stream_register_device_changed_callback =*/
36683668
audiounit_stream_register_device_changed_callback,
3669+
/*.stream_get_max_request_size = */NULL,
36693670
/*.register_device_collection_changed =*/
36703671
audiounit_register_device_collection_changed};

src/cubeb_jack.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ static struct cubeb_ops const cbjack_ops = {
175175
.stream_get_current_device = cbjack_stream_get_current_device,
176176
.stream_device_destroy = cbjack_stream_device_destroy,
177177
.stream_register_device_changed_callback = NULL,
178+
.stream_get_max_request_size = NULL,
178179
.register_device_collection_changed = NULL};
179180

180181
struct cubeb_stream {

src/cubeb_kai.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,4 +366,5 @@ static struct cubeb_ops const kai_ops = {
366366
/*.stream_get_current_device =*/NULL,
367367
/*.stream_device_destroy =*/NULL,
368368
/*.stream_register_device_changed_callback=*/NULL,
369+
/*.stream_get_max_request_size =*/NULL,
369370
/*.register_device_collection_changed=*/NULL};

src/cubeb_opensl.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1792,4 +1792,5 @@ static struct cubeb_ops const opensl_ops = {
17921792
.stream_get_current_device = NULL,
17931793
.stream_device_destroy = NULL,
17941794
.stream_register_device_changed_callback = NULL,
1795+
.stream_get_max_request_size = NULL,
17951796
.register_device_collection_changed = NULL};

src/cubeb_oss.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1326,4 +1326,5 @@ static struct cubeb_ops const oss_ops = {
13261326
.stream_get_current_device = oss_get_current_device,
13271327
.stream_device_destroy = oss_stream_device_destroy,
13281328
.stream_register_device_changed_callback = NULL,
1329+
.stream_get_max_request_size = NULL,
13291330
.register_device_collection_changed = NULL};

src/cubeb_pulse.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1696,5 +1696,6 @@ static struct cubeb_ops const pulse_ops = {
16961696
.stream_get_current_device = pulse_stream_get_current_device,
16971697
.stream_device_destroy = pulse_stream_device_destroy,
16981698
.stream_register_device_changed_callback = NULL,
1699+
.stream_get_max_request_size = NULL,
16991700
.register_device_collection_changed =
17001701
pulse_register_device_collection_changed};

src/cubeb_sndio.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -666,4 +666,5 @@ static struct cubeb_ops const sndio_ops = {
666666
.stream_get_current_device = NULL,
667667
.stream_device_destroy = NULL,
668668
.stream_register_device_changed_callback = NULL,
669+
.stream_get_max_request_size = NULL,
669670
.register_device_collection_changed = NULL};

src/cubeb_sun.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -730,4 +730,5 @@ static struct cubeb_ops const sun_ops = {
730730
.stream_get_current_device = sun_get_current_device,
731731
.stream_device_destroy = sun_stream_device_destroy,
732732
.stream_register_device_changed_callback = NULL,
733+
.stream_get_max_request_size = NULL,
733734
.register_device_collection_changed = NULL};

src/cubeb_wasapi.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2965,6 +2965,21 @@ wasapi_stream_set_volume(cubeb_stream * stm, float volume)
29652965
return CUBEB_OK;
29662966
}
29672967

2968+
// TODO: Need to implement stream_register_device_changed_callback.
2969+
int
2970+
wasapi_stream_get_max_request_size(cubeb_stream * stm, uint32_t * max_request_size)
2971+
{
2972+
auto_lock lock(stm->stream_reset_lock);
2973+
2974+
if (!stm->output_client && !stm->input_client) {
2975+
return CUBEB_ERROR;
2976+
}
2977+
2978+
*max_request_size = std::max(stm->output_buffer_frame_count, stm->input_buffer_frame_count);
2979+
2980+
return CUBEB_OK;
2981+
}
2982+
29682983
static char const *
29692984
wstr_to_utf8(LPCWSTR str)
29702985
{
@@ -3382,6 +3397,7 @@ cubeb_ops const wasapi_ops = {
33823397
/*.stream_get_current_device =*/NULL,
33833398
/*.stream_device_destroy =*/NULL,
33843399
/*.stream_register_device_changed_callback =*/NULL,
3400+
/*.stream_get_max_request_size =*/wasapi_stream_get_max_request_size,
33853401
/*.register_device_collection_changed =*/
33863402
wasapi_register_device_collection_changed,
33873403
};

src/cubeb_winmm.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1179,4 +1179,5 @@ static struct cubeb_ops const winmm_ops = {
11791179
/*.stream_get_current_device =*/NULL,
11801180
/*.stream_device_destroy =*/NULL,
11811181
/*.stream_register_device_changed_callback=*/NULL,
1182+
/*.stream_get_max_request_size = */NULL,
11821183
/*.register_device_collection_changed =*/NULL};

0 commit comments

Comments
 (0)