diff options
author | nia <nia@pkgsrc.org> | 2019-06-14 08:11:34 +0000 |
---|---|---|
committer | nia <nia@pkgsrc.org> | 2019-06-14 08:11:34 +0000 |
commit | ffcf8750dde322b88f9ad8b133e8d9d85f987e2a (patch) | |
tree | 56ff7bb42bc603cb93acbac327077ff8f61d16df /www | |
parent | 12dcd8b0d8bed078c9a80d18241d45394b8517ac (diff) | |
download | pkgsrc-ffcf8750dde322b88f9ad8b133e8d9d85f987e2a.tar.gz |
firefox52: This gets a sun audio too.
Like seamonkey, this uses an older API for it, so device detection for
microphones (etc) is currently disabled.
Diffstat (limited to 'www')
-rw-r--r-- | www/firefox52/Makefile | 5 | ||||
-rw-r--r-- | www/firefox52/distinfo | 10 | ||||
-rw-r--r-- | www/firefox52/files/cubeb_sun.c | 767 | ||||
-rw-r--r-- | www/firefox52/patches/patch-aa | 17 | ||||
-rw-r--r-- | www/firefox52/patches/patch-media_libcubeb_src_cubeb.c | 28 | ||||
-rw-r--r-- | www/firefox52/patches/patch-media_libcubeb_src_moz.build | 15 | ||||
-rw-r--r-- | www/firefox52/patches/patch-media_libcubeb_update.sh | 7 |
7 files changed, 825 insertions, 24 deletions
diff --git a/www/firefox52/Makefile b/www/firefox52/Makefile index 5060f309953..84d37723eae 100644 --- a/www/firefox52/Makefile +++ b/www/firefox52/Makefile @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.42 2019/06/01 19:11:28 maya Exp $ +# $NetBSD: Makefile,v 1.43 2019/06/14 08:11:34 nia Exp $ FIREFOX_VER= ${MOZ_BRANCH}${MOZ_BRANCH_MINOR} MOZ_BRANCH= 52.9 @@ -6,7 +6,7 @@ MOZ_BRANCH_MINOR= .0esr DISTNAME= firefox-${FIREFOX_VER}.source PKGNAME= firefox${MOZ_BRANCH:C/\..*$//}-${MOZ_BRANCH}${MOZ_BRANCH_MINOR:S/b/beta/:S/esr//} -PKGREVISION= 15 +PKGREVISION= 16 CATEGORIES= www MASTER_SITES+= ${MASTER_SITE_MOZILLA:=firefox/releases/${FIREFOX_VER}/source/} MASTER_SITES+= ${MASTER_SITE_MOZILLA_ALL:=firefox/releases/${FIREFOX_VER}/source/} @@ -74,6 +74,7 @@ SUBST_VARS.sys-dic= PREFIX post-extract: mv ${WRKSRC}/gfx/ycbcr/yuv_row_arm.s ${WRKSRC}/gfx/ycbcr/yuv_row_arm.S + ${CP} ${FILESDIR}/cubeb_sun.c ${WRKSRC}/media/libcubeb/src pre-configure: cd ${WRKSRC} && autoconf diff --git a/www/firefox52/distinfo b/www/firefox52/distinfo index 3c04c43f734..1218d506111 100644 --- a/www/firefox52/distinfo +++ b/www/firefox52/distinfo @@ -1,10 +1,10 @@ -$NetBSD: distinfo,v 1.20 2019/06/13 19:02:37 rjs Exp $ +$NetBSD: distinfo,v 1.21 2019/06/14 08:11:34 nia Exp $ SHA1 (firefox-52.9.0esr.source.tar.xz) = df3d47518b380fe934e32a288515c25435fd82a7 RMD160 (firefox-52.9.0esr.source.tar.xz) = 8940269f0a515c0066b6ab2eea1da8963d27617b SHA512 (firefox-52.9.0esr.source.tar.xz) = bfca42668ca78a12a9fb56368f4aae5334b1f7a71966fbba4c32b9c5e6597aac79a6e340ac3966779d2d5563eb47c054ab33cc40bfb7306172138ccbd3adb2b9 Size (firefox-52.9.0esr.source.tar.xz) = 214087304 bytes -SHA1 (patch-aa) = eb9368360208ba294d3d17e0c69815531aed1abf +SHA1 (patch-aa) = 0ca132012a7005a506cdecc0167d4c7782aee244 SHA1 (patch-ao) = 8b7125ef3b193fca4d03386142887b2f8d5015c5 SHA1 (patch-as) = b596132c7b6902c4f7ddb901e28e1437b99bb428 SHA1 (patch-build_gyp.mozbuild) = 481270e6703e556fb87a3440cb3cfb3d4fcc4c86 @@ -62,12 +62,12 @@ SHA1 (patch-js_src_moz.build) = ce9110506086d15a011d0985b58dd4e7d1b6ec5f SHA1 (patch-js_src_vm_StructuredClone.cpp) = 7e992825e996c43419318893b704a2aa380b0d2a SHA1 (patch-js_xpconnect_src_XPCConvert.cpp) = 915777e9bb5366be41866cdb6ea0ad2b1c006dde SHA1 (patch-js_xpconnect_src_xpcprivate.h) = e09e37819961bae40a9f276ae1ee510d2956c23e -SHA1 (patch-media_libcubeb_src_cubeb.c) = 3be0bf511cbd3b1c691fadb081acaf38838c36f4 +SHA1 (patch-media_libcubeb_src_cubeb.c) = 24075714155e5c95fddf95ae8865a71db6006c15 SHA1 (patch-media_libcubeb_src_cubeb__alsa.c) = c59eaf40973193885f32819b465b401c1ba45fce SHA1 (patch-media_libcubeb_src_cubeb__oss.c) = e15cc2d0c220738ccfd57f79eec242095c8ea536 -SHA1 (patch-media_libcubeb_src_moz.build) = 2b6d7e3bb265220decf9629b1d4b980cadb363fb +SHA1 (patch-media_libcubeb_src_moz.build) = b81696b0160e151b7f52621eb7ec69c704d93507 SHA1 (patch-media_libcubeb_tests_moz.build) = 63d8b749a6ebbe8fd662ce1e2bde6aa9cb0b807d -SHA1 (patch-media_libcubeb_update.sh) = 333e1e2898f1703a298ba2a3f731ffc63f09a184 +SHA1 (patch-media_libcubeb_update.sh) = d8f35f994f48119e20a79484e10a15ba13989936 SHA1 (patch-media_libsoundtouch_src_cpu__detect__x86.cpp) = db61737afa7773e8cbd82976de3a02c917174696 SHA1 (patch-media_libsoundtouch_src_soundtouch__perms.h) = 2d08a3b4176c155c57b458cb78043318b68d8fe2 SHA1 (patch-media_libtheora_lib_arm_armcpu.c) = 4b215277f9c81154377d401166023c1bf78a3718 diff --git a/www/firefox52/files/cubeb_sun.c b/www/firefox52/files/cubeb_sun.c new file mode 100644 index 00000000000..8c845e3d682 --- /dev/null +++ b/www/firefox52/files/cubeb_sun.c @@ -0,0 +1,767 @@ +/* + * Copyright © 2019 Nia Alarie + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ +#include <sys/audioio.h> +#include <sys/ioctl.h> +#include <fcntl.h> +#include <unistd.h> +#include <pthread.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <math.h> +#include "cubeb/cubeb.h" +#include "cubeb-internal.h" + +#define CUBEB_OLD_API /* seamonkey and older firefox */ + +#define BYTES_TO_FRAMES(bytes, channels) \ + (bytes / (channels * sizeof(int16_t))) + +#define FRAMES_TO_BYTES(frames, channels) \ + (frames * (channels * sizeof(int16_t))) + +/* Default to 4 + 1 for the default device. */ +#ifndef SUN_DEVICE_COUNT +#define SUN_DEVICE_COUNT (5) +#endif + +/* Supported well by most hardware. */ +#ifndef SUN_PREFER_RATE +#define SUN_PREFER_RATE (48000) +#endif + +/* Standard acceptable minimum. */ +#ifndef SUN_LATENCY_MS +#define SUN_LATENCY_MS (40) +#endif + +#ifndef SUN_DEFAULT_DEVICE +#define SUN_DEFAULT_DEVICE "/dev/audio" +#endif + +#ifndef SUN_POLL_TIMEOUT +#define SUN_POLL_TIMEOUT (1000) +#endif + +#ifndef SUN_BUFFER_FRAMES +#define SUN_BUFFER_FRAMES (32) +#endif + +/* + * Supported on NetBSD regardless of hardware. + */ + +#ifndef SUN_MAX_CHANNELS +# ifdef __NetBSD__ +# define SUN_MAX_CHANNELS (12) +# else +# define SUN_MAX_CHANNELS (2) +# endif +#endif + +#ifndef SUN_MIN_RATE +#define SUN_MIN_RATE (1000) +#endif + +#ifndef SUN_MAX_RATE +#define SUN_MAX_RATE (192000) +#endif + +static struct cubeb_ops const sun_ops; + +struct cubeb { + struct cubeb_ops const * ops; +}; + +struct cubeb_stream { + struct cubeb * context; + void * user_ptr; + pthread_t thread; + pthread_mutex_t mutex; /* protects running, volume, frames_written */ + int floating; + int running; + int play_fd; + int record_fd; + float volume; + struct audio_info p_info; /* info for the play fd */ + struct audio_info r_info; /* info for the record fd */ + cubeb_data_callback data_cb; + cubeb_state_callback state_cb; + int16_t * play_buf; + int16_t * record_buf; + float * f_play_buf; + float * f_record_buf; + char input_name[32]; + char output_name[32]; + uint64_t frames_written; + uint64_t blocks_written; +}; + +int +sun_init(cubeb ** context, char const * context_name) +{ + cubeb * c; + + (void)context_name; + if ((c = calloc(1, sizeof(cubeb))) == NULL) { + return CUBEB_ERROR; + } + c->ops = &sun_ops; + *context = c; + return CUBEB_OK; +} + +static void +sun_destroy(cubeb * context) +{ + free(context); +} + +static char const * +sun_get_backend_id(cubeb * context) +{ + return "sun"; +} + +static int +sun_get_preferred_sample_rate(cubeb * context, uint32_t * rate) +{ + (void)context; + + *rate = SUN_PREFER_RATE; + return CUBEB_OK; +} + +static int +sun_get_max_channel_count(cubeb * context, uint32_t * max_channels) +{ + (void)context; + + *max_channels = SUN_MAX_CHANNELS; + return CUBEB_OK; +} + +static int +sun_get_min_latency(cubeb * context, cubeb_stream_params params, + uint32_t * latency_frames) +{ + (void)context; + + *latency_frames = SUN_LATENCY_MS * params.rate / 1000; + return CUBEB_OK; +} + +static int +sun_get_hwinfo(const char * device, struct audio_info * format, + int * props, struct audio_device * dev) +{ + int fd = -1; + + if ((fd = open(device, O_RDONLY)) == -1) { + goto error; + } +#ifdef AUDIO_GETFORMAT + if (ioctl(fd, AUDIO_GETFORMAT, format) != 0) { + goto error; + } +#endif +#ifdef AUDIO_GETPROPS + if (ioctl(fd, AUDIO_GETPROPS, props) != 0) { + goto error; + } +#endif + if (ioctl(fd, AUDIO_GETDEV, dev) != 0) { + goto error; + } + close(fd); + return CUBEB_OK; +error: + if (fd != -1) { + close(fd); + } + return CUBEB_ERROR; +} + +/* + * XXX: PR kern/54264 + */ +static int +sun_prinfo_verify_sanity(struct audio_prinfo * prinfo) +{ + return prinfo->precision >= 8 && prinfo->precision <= 32 && + prinfo->channels >= 1 && prinfo->channels < SUN_MAX_CHANNELS && + prinfo->sample_rate < SUN_MAX_RATE && prinfo->sample_rate > SUN_MIN_RATE; +} + +#ifndef CUBEB_OLD_API +static int +sun_enumerate_devices(cubeb * context, cubeb_device_type type, + cubeb_device_collection * collection) +{ + unsigned i; + cubeb_device_info device = {0}; + char dev[16] = SUN_DEFAULT_DEVICE; + char dev_friendly[64]; + struct audio_info hwfmt; + struct audio_device hwname; + struct audio_prinfo *prinfo = NULL; + int hwprops; + + collection->device = calloc(SUN_DEVICE_COUNT, sizeof(cubeb_device_info)); + if (collection->device == NULL) { + return CUBEB_ERROR; + } + collection->count = 0; + + for (i = 0; i < SUN_DEVICE_COUNT; ++i) { + if (i > 0) { + (void)snprintf(dev, sizeof(dev), "/dev/audio%u", i - 1); + } + if (sun_get_hwinfo(dev, &hwfmt, &hwprops, &hwname) != CUBEB_OK) { + continue; + } +#ifdef AUDIO_GETPROPS + device.type = 0; + if ((hwprops & AUDIO_PROP_CAPTURE) != 0 && + sun_prinfo_verify_sanity(&hwfmt.record)) { + /* the device supports recording, probably */ + device.type |= CUBEB_DEVICE_TYPE_INPUT; + } + if ((hwprops & AUDIO_PROP_PLAYBACK) != 0 && + sun_prinfo_verify_sanity(&hwfmt.play)) { + /* the device supports playback, probably */ + device.type |= CUBEB_DEVICE_TYPE_OUTPUT; + } + switch (device.type) { + case 0: + /* device doesn't do input or output, aliens probably involved */ + continue; + case CUBEB_DEVICE_TYPE_INPUT: + if ((type & CUBEB_DEVICE_TYPE_INPUT) == 0) { + /* this device is input only, not scanning for those, skip it */ + continue; + } + break; + case CUBEB_DEVICE_TYPE_OUTPUT: + if ((type & CUBEB_DEVICE_TYPE_OUTPUT) == 0) { + /* this device is output only, not scanning for those, skip it */ + continue; + } + break; + } + if ((type & CUBEB_DEVICE_TYPE_INPUT) != 0) { + prinfo = &hwfmt.record; + } + if ((type & CUBEB_DEVICE_TYPE_OUTPUT) != 0) { + prinfo = &hwfmt.play; + } +#endif + if (i > 0) { + (void)snprintf(dev_friendly, sizeof(dev_friendly), "%s %s %s (%d)", + hwname.name, hwname.version, hwname.config, i - 1); + } else { + (void)snprintf(dev_friendly, sizeof(dev_friendly), "%s %s %s (default)", + hwname.name, hwname.version, hwname.config); + } + device.devid = (void *)(uintptr_t)i; + device.device_id = strdup(dev); + device.friendly_name = strdup(dev_friendly); + device.group_id = strdup(dev); + device.vendor_name = strdup(hwname.name); + device.type = type; + device.state = CUBEB_DEVICE_STATE_ENABLED; + device.preferred = (i == 0) ? CUBEB_DEVICE_PREF_ALL : CUBEB_DEVICE_PREF_NONE; +#ifdef AUDIO_GETFORMAT + device.max_channels = prinfo->channels; + device.default_rate = prinfo->sample_rate; +#else + device.max_channels = 2; + device.default_rate = SUN_PREFER_RATE; +#endif + device.default_format = CUBEB_DEVICE_FMT_S16NE; + device.format = CUBEB_DEVICE_FMT_S16NE; + device.min_rate = SUN_MIN_RATE; + device.max_rate = SUN_MAX_RATE; + device.latency_lo = SUN_LATENCY_MS * SUN_MIN_RATE / 1000; + device.latency_hi = SUN_LATENCY_MS * SUN_MAX_RATE / 1000; + collection->device[collection->count++] = device; + } + return CUBEB_OK; +} +#endif + +#ifndef CUBEB_OLD_API +static int +sun_device_collection_destroy(cubeb * context, + cubeb_device_collection * collection) +{ + unsigned i; + + for (i = 0; i < collection->count; ++i) { + free((char *)collection->device[i].device_id); + free((char *)collection->device[i].friendly_name); + free((char *)collection->device[i].group_id); + free((char *)collection->device[i].vendor_name); + } + free(collection->device); + return CUBEB_OK; +} +#endif + +static int +sun_copy_params(int fd, cubeb_stream * stream, cubeb_stream_params * params, + struct audio_info * info, struct audio_prinfo * prinfo) +{ + prinfo->channels = params->channels; + prinfo->sample_rate = params->rate; + prinfo->precision = 16; +#ifdef AUDIO_ENCODING_SLINEAR_LE + switch (params->format) { + case CUBEB_SAMPLE_S16LE: + prinfo->encoding = AUDIO_ENCODING_SLINEAR_LE; + break; + case CUBEB_SAMPLE_S16BE: + prinfo->encoding = AUDIO_ENCODING_SLINEAR_BE; + break; + case CUBEB_SAMPLE_FLOAT32NE: + stream->floating = 1; + prinfo->encoding = AUDIO_ENCODING_SLINEAR; + break; + default: + LOG("Unsupported format"); + return CUBEB_ERROR_INVALID_FORMAT; + } +#else + switch (params->format) { + case CUBEB_SAMPLE_S16NE: + prinfo->encoding = AUDIO_ENCODING_LINEAR; + break; + case CUBEB_SAMPLE_FLOAT32NE: + stream->floating = 1; + prinfo->encoding = AUDIO_ENCODING_LINEAR; + break; + default: + LOG("Unsupported format"); + return CUBEB_ERROR_INVALID_FORMAT; + } +#endif + if (ioctl(fd, AUDIO_SETINFO, info) == -1) { + return CUBEB_ERROR; + } + if (ioctl(fd, AUDIO_GETINFO, info) == -1) { + return CUBEB_ERROR; + } + return CUBEB_OK; +} + +static int +sun_stream_stop(cubeb_stream * s) +{ + pthread_mutex_lock(&s->mutex); + if (s->running) { + s->running = 0; + pthread_mutex_unlock(&s->mutex); + pthread_join(s->thread, NULL); + } else { + pthread_mutex_unlock(&s->mutex); + } + return CUBEB_OK; +} + +static void +sun_stream_destroy(cubeb_stream * s) +{ + pthread_mutex_destroy(&s->mutex); + sun_stream_stop(s); + if (s->play_fd != -1) { + close(s->play_fd); + } + if (s->record_fd != -1) { + close(s->record_fd); + } + free(s->f_play_buf); + free(s->f_record_buf); + free(s->play_buf); + free(s->record_buf); + free(s); +} + +static void +sun_float_to_linear(float * in, int16_t * out, + unsigned channels, long frames, float vol) +{ + unsigned i, sample_count = frames * channels; + float multiplier = vol * 0x8000; + + for (i = 0; i < sample_count; ++i) { + int32_t sample = lrintf(in[i] * multiplier); + if (sample < -0x8000) { + out[i] = -0x8000; + } else if (sample > 0x7fff) { + out[i] = 0x7fff; + } else { + out[i] = sample; + } + } +} + +static void +sun_linear_to_float(int16_t * in, float * out, + unsigned channels, long frames) +{ + unsigned i, sample_count = frames * channels; + + for (i = 0; i < sample_count; ++i) { + out[i] = (1.0 / 0x8000) * in[i]; + } +} + +static void +sun_linear_set_vol(int16_t * buf, unsigned channels, long frames, float vol) +{ + unsigned i, sample_count = frames * channels; + int32_t multiplier = vol * 0x8000; + + for (i = 0; i < sample_count; ++i) { + buf[i] = (buf[i] * multiplier) >> 15; + } +} + +static void * +sun_io_routine(void * arg) +{ + cubeb_stream *s = arg; + cubeb_state state = CUBEB_STATE_STARTED; + size_t to_read = 0; + long to_write = 0; + size_t write_ofs = 0; + size_t read_ofs = 0; + int drain = 0; + + s->state_cb(s, s->user_ptr, CUBEB_STATE_STARTED); + while (state != CUBEB_STATE_ERROR) { + pthread_mutex_lock(&s->mutex); + if (!s->running) { + pthread_mutex_unlock(&s->mutex); + state = CUBEB_STATE_STOPPED; + break; + } + pthread_mutex_unlock(&s->mutex); + if (s->floating) { + if (s->record_fd != -1) { + sun_linear_to_float(s->record_buf, s->f_record_buf, + s->r_info.record.channels, SUN_BUFFER_FRAMES); + } + to_write = s->data_cb(s, s->user_ptr, + s->f_record_buf, s->f_play_buf, SUN_BUFFER_FRAMES); + if (to_write == CUBEB_ERROR) { + state = CUBEB_STATE_ERROR; + break; + } + if (s->play_fd != -1) { + pthread_mutex_lock(&s->mutex); + sun_float_to_linear(s->f_play_buf, s->play_buf, + s->p_info.play.channels, to_write, s->volume); + pthread_mutex_unlock(&s->mutex); + } + } else { + to_write = s->data_cb(s, s->user_ptr, + s->record_buf, s->play_buf, SUN_BUFFER_FRAMES); + if (to_write == CUBEB_ERROR) { + state = CUBEB_STATE_ERROR; + break; + } + if (s->play_fd != -1) { + pthread_mutex_lock(&s->mutex); + sun_linear_set_vol(s->play_buf, s->p_info.play.channels, to_write, s->volume); + pthread_mutex_unlock(&s->mutex); + } + } + if (to_write < SUN_BUFFER_FRAMES) { + drain = 1; + } + to_write = s->play_fd != -1 ? to_write : 0; + to_read = s->record_fd != -1 ? SUN_BUFFER_FRAMES : 0; + write_ofs = 0; + read_ofs = 0; + while (to_write > 0 || to_read > 0) { + size_t bytes; + ssize_t n, frames; + + if (to_write > 0) { + bytes = FRAMES_TO_BYTES(to_write, s->p_info.play.channels); + if ((n = write(s->play_fd, s->play_buf + write_ofs, bytes)) < 0) { + state = CUBEB_STATE_ERROR; + break; + } + frames = BYTES_TO_FRAMES(n, s->p_info.play.channels); + pthread_mutex_lock(&s->mutex); + s->frames_written += frames; + pthread_mutex_unlock(&s->mutex); + to_write -= frames; + write_ofs += frames; + } + if (to_read > 0) { + bytes = FRAMES_TO_BYTES(to_read, s->r_info.record.channels); + if ((n = read(s->record_fd, s->record_buf + read_ofs, bytes)) < 0) { + state = CUBEB_STATE_ERROR; + break; + } + frames = BYTES_TO_FRAMES(n, s->r_info.record.channels); + to_read -= frames; + read_ofs += frames; + } + } + if (drain && state != CUBEB_STATE_ERROR) { + state = CUBEB_STATE_DRAINED; + break; + } + } + s->state_cb(s, s->user_ptr, state); + return NULL; +} + +static int +sun_stream_init(cubeb * context, + cubeb_stream ** stream, + char const * stream_name, + cubeb_devid input_device, + cubeb_stream_params * input_stream_params, + cubeb_devid output_device, + cubeb_stream_params * output_stream_params, + unsigned latency_frames, + cubeb_data_callback data_callback, + cubeb_state_callback state_callback, + void * user_ptr) +{ + int ret = CUBEB_OK; + cubeb_stream *s = NULL; + + (void)stream_name; + (void)latency_frames; + if ((s = calloc(1, sizeof(cubeb_stream))) == NULL) { + ret = CUBEB_ERROR; + goto error; + } + s->record_fd = -1; + s->play_fd = -1; + if (input_device != 0) { + snprintf(s->input_name, sizeof(s->input_name), + "/dev/audio%zu", (uintptr_t)input_device - 1); + } else { + snprintf(s->input_name, sizeof(s->input_name), "%s", SUN_DEFAULT_DEVICE); + } + if (output_device != 0) { + snprintf(s->output_name, sizeof(s->output_name), + "/dev/audio%zu", (uintptr_t)output_device - 1); + } else { + snprintf(s->output_name, sizeof(s->output_name), "%s", SUN_DEFAULT_DEVICE); + } + if (input_stream_params != NULL) { +#ifndef CUBEB_OLD_API + if (input_stream_params->prefs & CUBEB_STREAM_PREF_LOOPBACK) { + LOG("Loopback not supported"); + ret = CUBEB_ERROR_NOT_SUPPORTED; + goto error; + } +#endif + if (s->record_fd == -1) { + if ((s->record_fd = open(s->input_name, O_RDONLY)) == -1) { + LOG("Audio device cannot be opened as read-only"); + ret = CUBEB_ERROR_DEVICE_UNAVAILABLE; + goto error; + } + } + AUDIO_INITINFO(&s->r_info); +#ifdef AUMODE_RECORD + s->r_info.mode = AUMODE_RECORD; +#endif + if ((ret = sun_copy_params(s->record_fd, s, input_stream_params, + &s->r_info, &s->r_info.record)) != CUBEB_OK) { + LOG("Setting record params failed"); + goto error; + } + } + if (output_stream_params != NULL) { +#ifndef CUBEB_OLD_API + if (output_stream_params->prefs & CUBEB_STREAM_PREF_LOOPBACK) { + LOG("Loopback not supported"); + ret = CUBEB_ERROR_NOT_SUPPORTED; + goto error; + } +#endif + if (s->play_fd == -1) { + if ((s->play_fd = open(s->output_name, O_WRONLY)) == -1) { + LOG("Audio device cannot be opened as write-only"); + ret = CUBEB_ERROR_DEVICE_UNAVAILABLE; + goto error; + } + } + AUDIO_INITINFO(&s->p_info); +#ifdef AUMODE_PLAY + s->p_info.mode = AUMODE_PLAY; +#endif + if ((ret = sun_copy_params(s->play_fd, s, output_stream_params, + &s->p_info, &s->p_info.play)) != CUBEB_OK) { + LOG("Setting play params failed"); + goto error; + } + } + s->context = context; + s->volume = 1.0; + s->state_cb = state_callback; + s->data_cb = data_callback; + s->user_ptr = user_ptr; + if (pthread_mutex_init(&s->mutex, NULL) != 0) { + LOG("Failed to create mutex"); + goto error; + } + if (s->play_fd != -1 && (s->play_buf = calloc(SUN_BUFFER_FRAMES, + s->p_info.play.channels * sizeof(int16_t))) == NULL) { + ret = CUBEB_ERROR; + goto error; + } + if (s->record_fd != -1 && (s->record_buf = calloc(SUN_BUFFER_FRAMES, + s->r_info.record.channels * sizeof(int16_t))) == NULL) { + ret = CUBEB_ERROR; + goto error; + } + if (s->floating) { + if (s->play_fd != -1 && (s->f_play_buf = calloc(SUN_BUFFER_FRAMES, + s->p_info.play.channels * sizeof(float))) == NULL) { + ret = CUBEB_ERROR; + goto error; + } + if (s->record_fd != -1 && (s->f_record_buf = calloc(SUN_BUFFER_FRAMES, + s->r_info.record.channels * sizeof(float))) == NULL) { + ret = CUBEB_ERROR; + goto error; + } + } + *stream = s; + return CUBEB_OK; +error: + if (s != NULL) { + sun_stream_destroy(s); + } + return ret; +} + +static int +sun_stream_start(cubeb_stream * s) +{ + s->running = 1; + if (pthread_create(&s->thread, NULL, sun_io_routine, s) != 0) { + LOG("Couldn't create thread"); + return CUBEB_ERROR; + } + return CUBEB_OK; +} + +static int +sun_stream_get_position(cubeb_stream * s, uint64_t * position) +{ +#ifdef AUDIO_GETOOFFS + struct audio_offset offset; + + if (ioctl(s->play_fd, AUDIO_GETOOFFS, &offset) == -1) { + return CUBEB_ERROR; + } + s->blocks_written += offset.deltablks; + *position = BYTES_TO_FRAMES(s->blocks_written * s->p_info.blocksize, + s->p_info.play.channels); + return CUBEB_OK; +#else + pthread_mutex_lock(&s->mutex); + *position = s->frames_written; + pthread_mutex_unlock(&s->mutex); + return CUBEB_OK; +#endif +} + +static int +sun_stream_get_latency(cubeb_stream * stream, uint32_t * latency) +{ +#ifdef AUDIO_GETBUFINFO + struct audio_info info; + + if (ioctl(stream->play_fd, AUDIO_GETBUFINFO, &info) == -1) { + return CUBEB_ERROR; + } + + *latency = BYTES_TO_FRAMES(info.play.seek + info.blocksize, + info.play.channels); + return CUBEB_OK; +#else + cubeb_stream_params params; + + params.rate = stream->p_info.play.sample_rate; + + return sun_get_min_latency(NULL, params, latency); +#endif +} + +static int +sun_stream_set_volume(cubeb_stream * stream, float volume) +{ + pthread_mutex_lock(&stream->mutex); + stream->volume = volume; + pthread_mutex_unlock(&stream->mutex); + return CUBEB_OK; +} + +static int +sun_get_current_device(cubeb_stream * stream, cubeb_device ** const device) +{ + *device = calloc(1, sizeof(cubeb_device)); + if (*device == NULL) { + return CUBEB_ERROR; + } + (*device)->input_name = stream->record_fd != -1 ? + strdup(stream->input_name) : NULL; + (*device)->output_name = stream->play_fd != -1 ? + strdup(stream->output_name) : NULL; + return CUBEB_OK; +} + +static int +sun_stream_device_destroy(cubeb_stream * stream, cubeb_device * device) +{ + (void)stream; + free(device->input_name); + free(device->output_name); + free(device); + return CUBEB_OK; +} + +static struct cubeb_ops const sun_ops = { + .init = sun_init, + .get_backend_id = sun_get_backend_id, + .get_max_channel_count = sun_get_max_channel_count, + .get_min_latency = sun_get_min_latency, + .get_preferred_sample_rate = sun_get_preferred_sample_rate, +#ifndef CUBEB_OLD_API + .enumerate_devices = sun_enumerate_devices, + .device_collection_destroy = sun_device_collection_destroy, +#endif + .destroy = sun_destroy, + .stream_init = sun_stream_init, + .stream_destroy = sun_stream_destroy, + .stream_start = sun_stream_start, + .stream_stop = sun_stream_stop, +#ifndef CUBEB_OLD_API + .stream_reset_default_device = NULL, +#endif + .stream_get_position = sun_stream_get_position, + .stream_get_latency = sun_stream_get_latency, + .stream_set_volume = sun_stream_set_volume, + .stream_set_panning = NULL, + .stream_get_current_device = sun_get_current_device, + .stream_device_destroy = sun_stream_device_destroy, + .stream_register_device_changed_callback = NULL, + .register_device_collection_changed = NULL +}; diff --git a/www/firefox52/patches/patch-aa b/www/firefox52/patches/patch-aa index 2426593950f..f6ac8f18daa 100644 --- a/www/firefox52/patches/patch-aa +++ b/www/firefox52/patches/patch-aa @@ -1,11 +1,12 @@ -$NetBSD: patch-aa,v 1.2 2019/06/01 19:11:28 maya Exp $ +$NetBSD: patch-aa,v 1.3 2019/06/14 08:11:35 nia Exp $ * MOZ_ENABLE_PROFILER_SPS is not for users, Disable it * Disable libjpeg-turbo check * Add system libraries option * Add OSS audio support +* Add Sun audio support ---- old-configure.in.orig 2017-03-04 10:47:32.150192599 +0000 +--- old-configure.in.orig 2017-09-11 20:13:47.000000000 +0000 +++ old-configure.in @@ -2159,11 +2159,7 @@ if test "$MOZ_SYSTEM_JPEG" = 1; then #include <jpeglib.h> ], @@ -151,18 +152,21 @@ $NetBSD: patch-aa,v 1.2 2019/06/01 19:11:28 maya Exp $ dnl system libvpx Support dnl ======================================================== MOZ_ARG_WITH_BOOL(system-libvpx, -@@ -3208,6 +3312,67 @@ AC_DEFINE(MOZ_WEBM_ENCODER) +@@ -3208,6 +3312,71 @@ AC_DEFINE(MOZ_WEBM_ENCODER) AC_SUBST(MOZ_WEBM_ENCODER) dnl ================================== -+dnl = Check OSS availability ++dnl = Check OSS/sunaudio availability +dnl ================================== + +dnl If using Linux, Solaris or BSDs, ensure that OSS is available +case "$OS_TARGET" in -+Linux|SunOS|DragonFly|FreeBSD|NetBSD|GNU/kFreeBSD) ++Linux|DragonFly|FreeBSD|GNU/kFreeBSD) + MOZ_OSS=1 + ;; ++SunOS|NetBSD) ++ MOZ_SUN=1 ++ ;; +esac + +MOZ_ARG_WITH_STRING(oss, @@ -212,6 +216,7 @@ $NetBSD: patch-aa,v 1.2 2019/06/01 19:11:28 maya Exp $ +LIBS=$_SAVE_LIBS + +AC_SUBST(MOZ_OSS) ++AC_SUBST(MOZ_SUN) +AC_SUBST_LIST(MOZ_OSS_CFLAGS) +AC_SUBST_LIST(MOZ_OSS_LIBS) + @@ -219,7 +224,7 @@ $NetBSD: patch-aa,v 1.2 2019/06/01 19:11:28 maya Exp $ dnl = Check alsa availability on Linux dnl ================================== -@@ -5023,6 +5188,27 @@ if test "$USE_FC_FREETYPE"; then +@@ -5023,6 +5192,27 @@ if test "$USE_FC_FREETYPE"; then fi dnl ======================================================== diff --git a/www/firefox52/patches/patch-media_libcubeb_src_cubeb.c b/www/firefox52/patches/patch-media_libcubeb_src_cubeb.c index 19740db1991..e9c91367237 100644 --- a/www/firefox52/patches/patch-media_libcubeb_src_cubeb.c +++ b/www/firefox52/patches/patch-media_libcubeb_src_cubeb.c @@ -1,10 +1,20 @@ -$NetBSD: patch-media_libcubeb_src_cubeb.c,v 1.1 2017/04/27 01:55:57 ryoon Exp $ +$NetBSD: patch-media_libcubeb_src_cubeb.c,v 1.2 2019/06/14 08:11:35 nia Exp $ * Support OSS audio ---- media/libcubeb/src/cubeb.c.orig 2017-01-23 16:13:54.000000000 +0000 +--- media/libcubeb/src/cubeb.c.orig 2017-04-11 02:13:12.000000000 +0000 +++ media/libcubeb/src/cubeb.c -@@ -54,6 +54,9 @@ int audiotrack_init(cubeb ** context, ch +@@ -45,6 +45,9 @@ int wasapi_init(cubeb ** context, char c + #if defined(USE_SNDIO) + int sndio_init(cubeb ** context, char const * context_name); + #endif ++#if defined(USE_SUN) ++int sun_init(cubeb ** context, char const * context_name); ++#endif + #if defined(USE_OPENSL) + int opensl_init(cubeb ** context, char const * context_name); + #endif +@@ -54,6 +57,9 @@ int audiotrack_init(cubeb ** context, ch #if defined(USE_KAI) int kai_init(cubeb ** context, char const * context_name); #endif @@ -14,7 +24,17 @@ $NetBSD: patch-media_libcubeb_src_cubeb.c,v 1.1 2017/04/27 01:55:57 ryoon Exp $ static int -@@ -141,6 +144,9 @@ cubeb_init(cubeb ** context, char const +@@ -132,6 +138,9 @@ cubeb_init(cubeb ** context, char const + #if defined(USE_SNDIO) + sndio_init, + #endif ++#if defined(USE_SUN) ++ sun_init, ++#endif + #if defined(USE_OPENSL) + opensl_init, + #endif +@@ -141,6 +150,9 @@ cubeb_init(cubeb ** context, char const #if defined(USE_KAI) kai_init, #endif diff --git a/www/firefox52/patches/patch-media_libcubeb_src_moz.build b/www/firefox52/patches/patch-media_libcubeb_src_moz.build index 1db9c53ccf0..14008e7f87a 100644 --- a/www/firefox52/patches/patch-media_libcubeb_src_moz.build +++ b/www/firefox52/patches/patch-media_libcubeb_src_moz.build @@ -1,11 +1,12 @@ -$NetBSD: patch-media_libcubeb_src_moz.build,v 1.1 2017/04/27 01:55:57 ryoon Exp $ +$NetBSD: patch-media_libcubeb_src_moz.build,v 1.2 2019/06/14 08:11:35 nia Exp $ * Add OSS audio support +* Add Sun audio support * Support system library ---- media/libcubeb/src/moz.build.orig 2016-10-31 20:15:39.000000000 +0000 +--- media/libcubeb/src/moz.build.orig 2017-04-11 02:13:12.000000000 +0000 +++ media/libcubeb/src/moz.build -@@ -24,6 +24,12 @@ if CONFIG['MOZ_PULSEAUDIO'] or CONFIG['M +@@ -24,6 +24,18 @@ if CONFIG['MOZ_PULSEAUDIO'] or CONFIG['M 'cubeb_resampler.cpp', ] @@ -15,10 +16,16 @@ $NetBSD: patch-media_libcubeb_src_moz.build,v 1.1 2017/04/27 01:55:57 ryoon Exp + ] + DEFINES['USE_OSS'] = True + ++if CONFIG['MOZ_SUN']: ++ SOURCES += [ ++ 'cubeb_sun.c', ++ ] ++ DEFINES['USE_SUN'] = True ++ if CONFIG['MOZ_PULSEAUDIO']: SOURCES += [ 'cubeb_pulse.c', -@@ -81,6 +87,7 @@ if CONFIG['OS_TARGET'] == 'Android': +@@ -81,6 +93,7 @@ if CONFIG['OS_TARGET'] == 'Android': FINAL_LIBRARY = 'gkmedias' diff --git a/www/firefox52/patches/patch-media_libcubeb_update.sh b/www/firefox52/patches/patch-media_libcubeb_update.sh index 95ee32b44df..a3721cad37f 100644 --- a/www/firefox52/patches/patch-media_libcubeb_update.sh +++ b/www/firefox52/patches/patch-media_libcubeb_update.sh @@ -1,12 +1,13 @@ -$NetBSD: patch-media_libcubeb_update.sh,v 1.1 2017/04/27 01:55:57 ryoon Exp $ +$NetBSD: patch-media_libcubeb_update.sh,v 1.2 2019/06/14 08:11:35 nia Exp $ ---- media/libcubeb/update.sh.orig 2016-10-31 20:15:39.000000000 +0000 +--- media/libcubeb/update.sh.orig 2017-07-10 16:18:12.000000000 +0000 +++ media/libcubeb/update.sh -@@ -16,6 +16,7 @@ cp $1/src/cubeb_audiounit.cpp src +@@ -17,6 +17,8 @@ cp $1/src/cubeb_audiounit.cpp src cp $1/src/cubeb_osx_run_loop.h src cp $1/src/cubeb_jack.cpp src cp $1/src/cubeb_opensl.c src +cp $1/src/cubeb_oss.c src ++cp $1/src/cubeb_sun.c src cp $1/src/cubeb_panner.cpp src cp $1/src/cubeb_panner.h src cp $1/src/cubeb_pulse.c src |