From owner-svn-ports-all@freebsd.org Sat Oct 10 20:36:13 2020 Return-Path: Delivered-To: svn-ports-all@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 62078429FA0; Sat, 10 Oct 2020 20:36:13 +0000 (UTC) (envelope-from jbeich@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4C7xY92Kk0z4H5m; Sat, 10 Oct 2020 20:36:13 +0000 (UTC) (envelope-from jbeich@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 1A565104D1; Sat, 10 Oct 2020 20:36:13 +0000 (UTC) (envelope-from jbeich@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09AKaCFp056134; Sat, 10 Oct 2020 20:36:12 GMT (envelope-from jbeich@FreeBSD.org) Received: (from jbeich@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09AKaBpN056125; Sat, 10 Oct 2020 20:36:11 GMT (envelope-from jbeich@FreeBSD.org) Message-Id: <202010102036.09AKaBpN056125@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: jbeich set sender to jbeich@FreeBSD.org using -f From: Jan Beich Date: Sat, 10 Oct 2020 20:36:11 +0000 (UTC) To: ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-branches@freebsd.org Subject: svn commit: r552020 - in branches/2020Q4: mail/thunderbird mail/thunderbird/files www/firefox www/firefox-esr www/firefox-esr/files www/firefox/files X-SVN-Group: ports-branches X-SVN-Commit-Author: jbeich X-SVN-Commit-Paths: in branches/2020Q4: mail/thunderbird mail/thunderbird/files www/firefox www/firefox-esr www/firefox-esr/files www/firefox/files X-SVN-Commit-Revision: 552020 X-SVN-Commit-Repository: ports MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-ports-all@freebsd.org X-Mailman-Version: 2.1.33 Precedence: list List-Id: SVN commit messages for the ports tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 10 Oct 2020 20:36:13 -0000 Author: jbeich Date: Sat Oct 10 20:36:11 2020 New Revision: 552020 URL: https://svnweb.freebsd.org/changeset/ports/552020 Log: MFH: r551843 r552018 gecko: update OSS patches Changes: https://github.com/kinetiknz/cubeb/compare/cc85508...1f3771f Changes: https://github.com/kinetiknz/cubeb/commit/4e60bb8 Approved by: ports-secteam blanket Modified: branches/2020Q4/mail/thunderbird/Makefile branches/2020Q4/mail/thunderbird/files/patch-cubeb-oss branches/2020Q4/www/firefox-esr/Makefile branches/2020Q4/www/firefox-esr/files/patch-cubeb-oss branches/2020Q4/www/firefox/Makefile branches/2020Q4/www/firefox/files/patch-cubeb-oss Directory Properties: branches/2020Q4/ (props changed) Modified: branches/2020Q4/mail/thunderbird/Makefile ============================================================================== --- branches/2020Q4/mail/thunderbird/Makefile Sat Oct 10 20:35:14 2020 (r552019) +++ branches/2020Q4/mail/thunderbird/Makefile Sat Oct 10 20:36:11 2020 (r552020) @@ -3,7 +3,7 @@ PORTNAME= thunderbird DISTVERSION= 78.3.2 -PORTREVISION= 1 +PORTREVISION= 3 CATEGORIES= mail news net-im MASTER_SITES= MOZILLA/${PORTNAME}/releases/${DISTVERSION}/source \ MOZILLA/${PORTNAME}/candidates/${DISTVERSION}-candidates/build1/source Modified: branches/2020Q4/mail/thunderbird/files/patch-cubeb-oss ============================================================================== --- branches/2020Q4/mail/thunderbird/files/patch-cubeb-oss Sat Oct 10 20:35:14 2020 (r552019) +++ branches/2020Q4/mail/thunderbird/files/patch-cubeb-oss Sat Oct 10 20:36:11 2020 (r552020) @@ -61,7 +61,7 @@ https://github.com/kinetiknz/cubeb/pull/600 #endif --- /dev/null +++ media/libcubeb/src/cubeb_oss.c -@@ -0,0 +1,1242 @@ +@@ -0,0 +1,1263 @@ +/* + * Copyright © 2019-2020 Nia Alarie + * Copyright © 2020 Ka Ho Ng @@ -179,19 +179,20 @@ https://github.com/kinetiknz/cubeb/pull/600 + struct cubeb * context; + void * user_ptr; + pthread_t thread; -+ pthread_cond_t doorbell_cv; -+ pthread_cond_t stopped_cv; -+ /* protects doorbell_cv, stopped_cv, running, destroying, volume, frames_written */ -+ pthread_mutex_t mtx; -+ bool thread_created; -+ bool running; -+ bool destroying; -+ float volume; ++ bool doorbell; /* (m) */ ++ pthread_cond_t doorbell_cv; /* (m) */ ++ pthread_cond_t stopped_cv; /* (m) */ ++ pthread_mutex_t mtx; /* Members protected by this should be marked (m) */ ++ bool thread_created; /* (m) */ ++ bool running; /* (m) */ ++ bool destroying; /* (m) */ ++ cubeb_state state; /* (m) */ ++ float volume /* (m) */; + struct oss_stream play; + struct oss_stream record; + cubeb_data_callback data_cb; + cubeb_state_callback state_cb; -+ uint64_t frames_written; ++ uint64_t frames_written /* (m) */; + unsigned int nfr; /* Number of frames allocated */ + unsigned int nfrags; + unsigned int bufframes; @@ -728,10 +729,16 @@ https://github.com/kinetiknz/cubeb/pull/600 + pthread_mutex_lock(&s->mtx); + if (s->thread_created && s->running) { + s->running = false; -+ pthread_cond_signal(&s->doorbell_cv); ++ s->doorbell = false; + pthread_cond_wait(&s->stopped_cv, &s->mtx); + } -+ pthread_mutex_unlock(&s->mtx); ++ if (s->state != CUBEB_STATE_STOPPED) { ++ s->state = CUBEB_STATE_STOPPED; ++ pthread_mutex_unlock(&s->mtx); ++ s->state_cb(s, s->user_ptr, CUBEB_STATE_STOPPED); ++ } else { ++ pthread_mutex_unlock(&s->mtx); ++ } + return CUBEB_OK; +} + @@ -741,6 +748,7 @@ https://github.com/kinetiknz/cubeb/pull/600 + pthread_mutex_lock(&s->mtx); + if (s->thread_created) { + s->destroying = true; ++ s->doorbell = true; + pthread_cond_signal(&s->doorbell_cv); + } + pthread_mutex_unlock(&s->mtx); @@ -800,10 +808,11 @@ https://github.com/kinetiknz/cubeb/pull/600 + } +} + ++/* 1 - Stopped by cubeb_stream_stop, otherwise 0 */ +static int -+oss_audio_loop(cubeb_stream * s) ++oss_audio_loop(cubeb_stream * s, cubeb_state *new_state) +{ -+ int state = CUBEB_STATE_STARTED; ++ cubeb_state state = CUBEB_STATE_STOPPED; + int trig = 0; + int drain = 0; + struct pollfd pfds[2]; @@ -821,13 +830,13 @@ https://github.com/kinetiknz/cubeb/pull/600 + if (ioctl(s->record.fd, SNDCTL_DSP_SETTRIGGER, &trig)) { + LOG("Error %d occured when setting trigger on record fd", errno); + state = CUBEB_STATE_ERROR; -+ goto out; ++ goto breakdown; + } + trig |= PCM_ENABLE_INPUT; + if (ioctl(s->record.fd, SNDCTL_DSP_SETTRIGGER, &trig)) { + LOG("Error %d occured when setting trigger on record fd", errno); + state = CUBEB_STATE_ERROR; -+ goto out; ++ goto breakdown; + } + memset(s->record.buf, 0, s->bufframes * s->record.frame_size); + } @@ -838,7 +847,6 @@ https://github.com/kinetiknz/cubeb/pull/600 + pthread_mutex_lock(&s->mtx); + if (!s->running || s->destroying) { + pthread_mutex_unlock(&s->mtx); -+ state = CUBEB_STATE_STOPPED; + break; + } + pthread_mutex_unlock(&s->mtx); @@ -848,8 +856,7 @@ https://github.com/kinetiknz/cubeb/pull/600 + * play-only stream or record-only stream + */ + -+ state = CUBEB_STATE_STOPPED; -+ break; ++ goto breakdown; + } + + while ((s->bufframes - ppending) >= s->nfr && rpending >= s->nfr) { @@ -865,7 +872,7 @@ https://github.com/kinetiknz/cubeb/pull/600 + nfr = s->data_cb(s, s->user_ptr, rptr, pptr, n); + if (nfr == CUBEB_ERROR) { + state = CUBEB_STATE_ERROR; -+ goto out; ++ goto breakdown; + } + if (pptr) { + float vol; @@ -902,7 +909,7 @@ https://github.com/kinetiknz/cubeb/pull/600 + */ + + state = CUBEB_STATE_STOPPED; -+ goto out; ++ goto breakdown; + } + } + } @@ -919,7 +926,7 @@ https://github.com/kinetiknz/cubeb/pull/600 + continue; + LOG("Error %d occured when polling playback and record fd", errno); + state = CUBEB_STATE_ERROR; -+ goto out; ++ goto breakdown; + } else if (nfds == 0) + continue; + @@ -927,7 +934,7 @@ https://github.com/kinetiknz/cubeb/pull/600 + (pfds[1].revents & (POLLERR | POLLHUP))) { + LOG("Error occured on playback, record fds"); + state = CUBEB_STATE_ERROR; -+ goto out; ++ goto breakdown; + } + + if (pfds[0].revents) { @@ -942,7 +949,7 @@ https://github.com/kinetiknz/cubeb/pull/600 + break; + } + state = CUBEB_STATE_ERROR; -+ goto out; ++ goto breakdown; + } + frames = n / s->play.frame_size; + pthread_mutex_lock(&s->mtx); @@ -963,7 +970,7 @@ https://github.com/kinetiknz/cubeb/pull/600 + if (errno == EAGAIN) + break; + state = CUBEB_STATE_ERROR; -+ goto out; ++ goto breakdown; + } + frames = n / s->record.frame_size; + rpending += frames; @@ -971,19 +978,26 @@ https://github.com/kinetiknz/cubeb/pull/600 + } + if (drain) { + state = CUBEB_STATE_DRAINED; -+ break; ++ goto breakdown; + } + } + -+out: -+ return state; ++ return 1; ++ ++breakdown: ++ pthread_mutex_lock(&s->mtx); ++ *new_state = s->state = state; ++ s->running = false; ++ pthread_mutex_unlock(&s->mtx); ++ return 0; +} + +static void * +oss_io_routine(void *arg) +{ + cubeb_stream *s = arg; -+ cubeb_state state = CUBEB_STATE_STARTED; ++ cubeb_state new_state; ++ int stopped; + + do { + pthread_mutex_lock(&s->mtx); @@ -993,15 +1007,11 @@ https://github.com/kinetiknz/cubeb/pull/600 + } + pthread_mutex_unlock(&s->mtx); + -+ state = CUBEB_STATE_STARTED; -+ s->state_cb(s, s->user_ptr, state); -+ -+ state = oss_audio_loop(s); -+ assert(state != CUBEB_STATE_STARTED); -+ ++ stopped = oss_audio_loop(s, &new_state); + if (s->record.fd != -1) + ioctl(s->record.fd, SNDCTL_DSP_HALT_INPUT, NULL); -+ s->state_cb(s, s->user_ptr, state); ++ if (!stopped) ++ s->state_cb(s, s->user_ptr, new_state); + + pthread_mutex_lock(&s->mtx); + pthread_cond_signal(&s->stopped_cv); @@ -1009,7 +1019,10 @@ https://github.com/kinetiknz/cubeb/pull/600 + pthread_mutex_unlock(&s->mtx); + break; + } -+ pthread_cond_wait(&s->doorbell_cv, &s->mtx); ++ while (!s->doorbell) { ++ pthread_cond_wait(&s->doorbell_cv, &s->mtx); ++ } ++ s->doorbell = false; + pthread_mutex_unlock(&s->mtx); + } while (1); + @@ -1061,6 +1074,7 @@ https://github.com/kinetiknz/cubeb/pull/600 + ret = CUBEB_ERROR; + goto error; + } ++ s->state = CUBEB_STATE_STOPPED; + s->record.fd = s->play.fd = -1; + s->nfr = latency_frames; + if (input_device != NULL) { @@ -1169,6 +1183,7 @@ https://github.com/kinetiknz/cubeb/pull/600 + LOG("Failed to create cv"); + goto error; + } ++ s->doorbell = false; + + if (s->play.fd != -1) { + if ((s->play.buf = calloc(s->bufframes, s->play.frame_size)) == NULL) { @@ -1196,6 +1211,7 @@ https://github.com/kinetiknz/cubeb/pull/600 +oss_stream_thr_create(cubeb_stream * s) +{ + if (s->thread_created) { ++ s->doorbell = true; + pthread_cond_signal(&s->doorbell_cv); + return CUBEB_OK; + } @@ -1211,11 +1227,16 @@ https://github.com/kinetiknz/cubeb/pull/600 +static int +oss_stream_start(cubeb_stream * s) +{ ++ s->state_cb(s, s->user_ptr, CUBEB_STATE_STARTED); + pthread_mutex_lock(&s->mtx); -+ if (!s->running && oss_stream_thr_create(s) != CUBEB_OK) { ++ /* Disallow starting an already started stream */ ++ assert(!s->running && s->state != CUBEB_STATE_STARTED); ++ if (oss_stream_thr_create(s) != CUBEB_OK) { + pthread_mutex_unlock(&s->mtx); ++ s->state_cb(s, s->user_ptr, CUBEB_STATE_ERROR); + return CUBEB_ERROR; + } ++ s->state = CUBEB_STATE_STARTED; + s->thread_created = true; + s->running = true; + pthread_mutex_unlock(&s->mtx); Modified: branches/2020Q4/www/firefox-esr/Makefile ============================================================================== --- branches/2020Q4/www/firefox-esr/Makefile Sat Oct 10 20:35:14 2020 (r552019) +++ branches/2020Q4/www/firefox-esr/Makefile Sat Oct 10 20:36:11 2020 (r552020) @@ -3,7 +3,7 @@ PORTNAME= firefox DISTVERSION= 78.3.1 -PORTREVISION= 1 +PORTREVISION= 3 PORTEPOCH= 1 CATEGORIES= www MASTER_SITES= MOZILLA/${PORTNAME}/releases/${DISTVERSION}esr/source \ Modified: branches/2020Q4/www/firefox-esr/files/patch-cubeb-oss ============================================================================== --- branches/2020Q4/www/firefox-esr/files/patch-cubeb-oss Sat Oct 10 20:35:14 2020 (r552019) +++ branches/2020Q4/www/firefox-esr/files/patch-cubeb-oss Sat Oct 10 20:36:11 2020 (r552020) @@ -61,7 +61,7 @@ https://github.com/kinetiknz/cubeb/pull/600 #endif --- /dev/null +++ media/libcubeb/src/cubeb_oss.c -@@ -0,0 +1,1242 @@ +@@ -0,0 +1,1263 @@ +/* + * Copyright © 2019-2020 Nia Alarie + * Copyright © 2020 Ka Ho Ng @@ -179,19 +179,20 @@ https://github.com/kinetiknz/cubeb/pull/600 + struct cubeb * context; + void * user_ptr; + pthread_t thread; -+ pthread_cond_t doorbell_cv; -+ pthread_cond_t stopped_cv; -+ /* protects doorbell_cv, stopped_cv, running, destroying, volume, frames_written */ -+ pthread_mutex_t mtx; -+ bool thread_created; -+ bool running; -+ bool destroying; -+ float volume; ++ bool doorbell; /* (m) */ ++ pthread_cond_t doorbell_cv; /* (m) */ ++ pthread_cond_t stopped_cv; /* (m) */ ++ pthread_mutex_t mtx; /* Members protected by this should be marked (m) */ ++ bool thread_created; /* (m) */ ++ bool running; /* (m) */ ++ bool destroying; /* (m) */ ++ cubeb_state state; /* (m) */ ++ float volume /* (m) */; + struct oss_stream play; + struct oss_stream record; + cubeb_data_callback data_cb; + cubeb_state_callback state_cb; -+ uint64_t frames_written; ++ uint64_t frames_written /* (m) */; + unsigned int nfr; /* Number of frames allocated */ + unsigned int nfrags; + unsigned int bufframes; @@ -728,10 +729,16 @@ https://github.com/kinetiknz/cubeb/pull/600 + pthread_mutex_lock(&s->mtx); + if (s->thread_created && s->running) { + s->running = false; -+ pthread_cond_signal(&s->doorbell_cv); ++ s->doorbell = false; + pthread_cond_wait(&s->stopped_cv, &s->mtx); + } -+ pthread_mutex_unlock(&s->mtx); ++ if (s->state != CUBEB_STATE_STOPPED) { ++ s->state = CUBEB_STATE_STOPPED; ++ pthread_mutex_unlock(&s->mtx); ++ s->state_cb(s, s->user_ptr, CUBEB_STATE_STOPPED); ++ } else { ++ pthread_mutex_unlock(&s->mtx); ++ } + return CUBEB_OK; +} + @@ -741,6 +748,7 @@ https://github.com/kinetiknz/cubeb/pull/600 + pthread_mutex_lock(&s->mtx); + if (s->thread_created) { + s->destroying = true; ++ s->doorbell = true; + pthread_cond_signal(&s->doorbell_cv); + } + pthread_mutex_unlock(&s->mtx); @@ -800,10 +808,11 @@ https://github.com/kinetiknz/cubeb/pull/600 + } +} + ++/* 1 - Stopped by cubeb_stream_stop, otherwise 0 */ +static int -+oss_audio_loop(cubeb_stream * s) ++oss_audio_loop(cubeb_stream * s, cubeb_state *new_state) +{ -+ int state = CUBEB_STATE_STARTED; ++ cubeb_state state = CUBEB_STATE_STOPPED; + int trig = 0; + int drain = 0; + struct pollfd pfds[2]; @@ -821,13 +830,13 @@ https://github.com/kinetiknz/cubeb/pull/600 + if (ioctl(s->record.fd, SNDCTL_DSP_SETTRIGGER, &trig)) { + LOG("Error %d occured when setting trigger on record fd", errno); + state = CUBEB_STATE_ERROR; -+ goto out; ++ goto breakdown; + } + trig |= PCM_ENABLE_INPUT; + if (ioctl(s->record.fd, SNDCTL_DSP_SETTRIGGER, &trig)) { + LOG("Error %d occured when setting trigger on record fd", errno); + state = CUBEB_STATE_ERROR; -+ goto out; ++ goto breakdown; + } + memset(s->record.buf, 0, s->bufframes * s->record.frame_size); + } @@ -838,7 +847,6 @@ https://github.com/kinetiknz/cubeb/pull/600 + pthread_mutex_lock(&s->mtx); + if (!s->running || s->destroying) { + pthread_mutex_unlock(&s->mtx); -+ state = CUBEB_STATE_STOPPED; + break; + } + pthread_mutex_unlock(&s->mtx); @@ -848,8 +856,7 @@ https://github.com/kinetiknz/cubeb/pull/600 + * play-only stream or record-only stream + */ + -+ state = CUBEB_STATE_STOPPED; -+ break; ++ goto breakdown; + } + + while ((s->bufframes - ppending) >= s->nfr && rpending >= s->nfr) { @@ -865,7 +872,7 @@ https://github.com/kinetiknz/cubeb/pull/600 + nfr = s->data_cb(s, s->user_ptr, rptr, pptr, n); + if (nfr == CUBEB_ERROR) { + state = CUBEB_STATE_ERROR; -+ goto out; ++ goto breakdown; + } + if (pptr) { + float vol; @@ -902,7 +909,7 @@ https://github.com/kinetiknz/cubeb/pull/600 + */ + + state = CUBEB_STATE_STOPPED; -+ goto out; ++ goto breakdown; + } + } + } @@ -919,7 +926,7 @@ https://github.com/kinetiknz/cubeb/pull/600 + continue; + LOG("Error %d occured when polling playback and record fd", errno); + state = CUBEB_STATE_ERROR; -+ goto out; ++ goto breakdown; + } else if (nfds == 0) + continue; + @@ -927,7 +934,7 @@ https://github.com/kinetiknz/cubeb/pull/600 + (pfds[1].revents & (POLLERR | POLLHUP))) { + LOG("Error occured on playback, record fds"); + state = CUBEB_STATE_ERROR; -+ goto out; ++ goto breakdown; + } + + if (pfds[0].revents) { @@ -942,7 +949,7 @@ https://github.com/kinetiknz/cubeb/pull/600 + break; + } + state = CUBEB_STATE_ERROR; -+ goto out; ++ goto breakdown; + } + frames = n / s->play.frame_size; + pthread_mutex_lock(&s->mtx); @@ -963,7 +970,7 @@ https://github.com/kinetiknz/cubeb/pull/600 + if (errno == EAGAIN) + break; + state = CUBEB_STATE_ERROR; -+ goto out; ++ goto breakdown; + } + frames = n / s->record.frame_size; + rpending += frames; @@ -971,19 +978,26 @@ https://github.com/kinetiknz/cubeb/pull/600 + } + if (drain) { + state = CUBEB_STATE_DRAINED; -+ break; ++ goto breakdown; + } + } + -+out: -+ return state; ++ return 1; ++ ++breakdown: ++ pthread_mutex_lock(&s->mtx); ++ *new_state = s->state = state; ++ s->running = false; ++ pthread_mutex_unlock(&s->mtx); ++ return 0; +} + +static void * +oss_io_routine(void *arg) +{ + cubeb_stream *s = arg; -+ cubeb_state state = CUBEB_STATE_STARTED; ++ cubeb_state new_state; ++ int stopped; + + do { + pthread_mutex_lock(&s->mtx); @@ -993,15 +1007,11 @@ https://github.com/kinetiknz/cubeb/pull/600 + } + pthread_mutex_unlock(&s->mtx); + -+ state = CUBEB_STATE_STARTED; -+ s->state_cb(s, s->user_ptr, state); -+ -+ state = oss_audio_loop(s); -+ assert(state != CUBEB_STATE_STARTED); -+ ++ stopped = oss_audio_loop(s, &new_state); + if (s->record.fd != -1) + ioctl(s->record.fd, SNDCTL_DSP_HALT_INPUT, NULL); -+ s->state_cb(s, s->user_ptr, state); ++ if (!stopped) ++ s->state_cb(s, s->user_ptr, new_state); + + pthread_mutex_lock(&s->mtx); + pthread_cond_signal(&s->stopped_cv); @@ -1009,7 +1019,10 @@ https://github.com/kinetiknz/cubeb/pull/600 + pthread_mutex_unlock(&s->mtx); + break; + } -+ pthread_cond_wait(&s->doorbell_cv, &s->mtx); ++ while (!s->doorbell) { ++ pthread_cond_wait(&s->doorbell_cv, &s->mtx); ++ } ++ s->doorbell = false; + pthread_mutex_unlock(&s->mtx); + } while (1); + @@ -1061,6 +1074,7 @@ https://github.com/kinetiknz/cubeb/pull/600 + ret = CUBEB_ERROR; + goto error; + } ++ s->state = CUBEB_STATE_STOPPED; + s->record.fd = s->play.fd = -1; + s->nfr = latency_frames; + if (input_device != NULL) { @@ -1169,6 +1183,7 @@ https://github.com/kinetiknz/cubeb/pull/600 + LOG("Failed to create cv"); + goto error; + } ++ s->doorbell = false; + + if (s->play.fd != -1) { + if ((s->play.buf = calloc(s->bufframes, s->play.frame_size)) == NULL) { @@ -1196,6 +1211,7 @@ https://github.com/kinetiknz/cubeb/pull/600 +oss_stream_thr_create(cubeb_stream * s) +{ + if (s->thread_created) { ++ s->doorbell = true; + pthread_cond_signal(&s->doorbell_cv); + return CUBEB_OK; + } @@ -1211,11 +1227,16 @@ https://github.com/kinetiknz/cubeb/pull/600 +static int +oss_stream_start(cubeb_stream * s) +{ ++ s->state_cb(s, s->user_ptr, CUBEB_STATE_STARTED); + pthread_mutex_lock(&s->mtx); -+ if (!s->running && oss_stream_thr_create(s) != CUBEB_OK) { ++ /* Disallow starting an already started stream */ ++ assert(!s->running && s->state != CUBEB_STATE_STARTED); ++ if (oss_stream_thr_create(s) != CUBEB_OK) { + pthread_mutex_unlock(&s->mtx); ++ s->state_cb(s, s->user_ptr, CUBEB_STATE_ERROR); + return CUBEB_ERROR; + } ++ s->state = CUBEB_STATE_STARTED; + s->thread_created = true; + s->running = true; + pthread_mutex_unlock(&s->mtx); Modified: branches/2020Q4/www/firefox/Makefile ============================================================================== --- branches/2020Q4/www/firefox/Makefile Sat Oct 10 20:35:14 2020 (r552019) +++ branches/2020Q4/www/firefox/Makefile Sat Oct 10 20:36:11 2020 (r552020) @@ -3,7 +3,7 @@ PORTNAME= firefox DISTVERSION= 81.0.1 -PORTREVISION= 1 +PORTREVISION= 3 PORTEPOCH= 2 CATEGORIES= www MASTER_SITES= MOZILLA/${PORTNAME}/releases/${DISTVERSION}/source \ Modified: branches/2020Q4/www/firefox/files/patch-cubeb-oss ============================================================================== --- branches/2020Q4/www/firefox/files/patch-cubeb-oss Sat Oct 10 20:35:14 2020 (r552019) +++ branches/2020Q4/www/firefox/files/patch-cubeb-oss Sat Oct 10 20:36:11 2020 (r552020) @@ -61,7 +61,7 @@ https://github.com/kinetiknz/cubeb/pull/600 #endif --- /dev/null +++ media/libcubeb/src/cubeb_oss.c -@@ -0,0 +1,1242 @@ +@@ -0,0 +1,1263 @@ +/* + * Copyright © 2019-2020 Nia Alarie + * Copyright © 2020 Ka Ho Ng @@ -179,19 +179,20 @@ https://github.com/kinetiknz/cubeb/pull/600 + struct cubeb * context; + void * user_ptr; + pthread_t thread; -+ pthread_cond_t doorbell_cv; -+ pthread_cond_t stopped_cv; -+ /* protects doorbell_cv, stopped_cv, running, destroying, volume, frames_written */ -+ pthread_mutex_t mtx; -+ bool thread_created; -+ bool running; -+ bool destroying; -+ float volume; ++ bool doorbell; /* (m) */ ++ pthread_cond_t doorbell_cv; /* (m) */ ++ pthread_cond_t stopped_cv; /* (m) */ ++ pthread_mutex_t mtx; /* Members protected by this should be marked (m) */ ++ bool thread_created; /* (m) */ ++ bool running; /* (m) */ ++ bool destroying; /* (m) */ ++ cubeb_state state; /* (m) */ ++ float volume /* (m) */; + struct oss_stream play; + struct oss_stream record; + cubeb_data_callback data_cb; + cubeb_state_callback state_cb; -+ uint64_t frames_written; ++ uint64_t frames_written /* (m) */; + unsigned int nfr; /* Number of frames allocated */ + unsigned int nfrags; + unsigned int bufframes; @@ -728,10 +729,16 @@ https://github.com/kinetiknz/cubeb/pull/600 + pthread_mutex_lock(&s->mtx); + if (s->thread_created && s->running) { + s->running = false; -+ pthread_cond_signal(&s->doorbell_cv); ++ s->doorbell = false; + pthread_cond_wait(&s->stopped_cv, &s->mtx); + } -+ pthread_mutex_unlock(&s->mtx); ++ if (s->state != CUBEB_STATE_STOPPED) { ++ s->state = CUBEB_STATE_STOPPED; ++ pthread_mutex_unlock(&s->mtx); ++ s->state_cb(s, s->user_ptr, CUBEB_STATE_STOPPED); ++ } else { ++ pthread_mutex_unlock(&s->mtx); ++ } + return CUBEB_OK; +} + @@ -741,6 +748,7 @@ https://github.com/kinetiknz/cubeb/pull/600 + pthread_mutex_lock(&s->mtx); + if (s->thread_created) { + s->destroying = true; ++ s->doorbell = true; + pthread_cond_signal(&s->doorbell_cv); + } + pthread_mutex_unlock(&s->mtx); @@ -800,10 +808,11 @@ https://github.com/kinetiknz/cubeb/pull/600 + } +} + ++/* 1 - Stopped by cubeb_stream_stop, otherwise 0 */ +static int -+oss_audio_loop(cubeb_stream * s) ++oss_audio_loop(cubeb_stream * s, cubeb_state *new_state) +{ -+ int state = CUBEB_STATE_STARTED; ++ cubeb_state state = CUBEB_STATE_STOPPED; + int trig = 0; + int drain = 0; + struct pollfd pfds[2]; @@ -821,13 +830,13 @@ https://github.com/kinetiknz/cubeb/pull/600 + if (ioctl(s->record.fd, SNDCTL_DSP_SETTRIGGER, &trig)) { + LOG("Error %d occured when setting trigger on record fd", errno); + state = CUBEB_STATE_ERROR; -+ goto out; ++ goto breakdown; + } + trig |= PCM_ENABLE_INPUT; + if (ioctl(s->record.fd, SNDCTL_DSP_SETTRIGGER, &trig)) { + LOG("Error %d occured when setting trigger on record fd", errno); + state = CUBEB_STATE_ERROR; -+ goto out; ++ goto breakdown; + } + memset(s->record.buf, 0, s->bufframes * s->record.frame_size); + } @@ -838,7 +847,6 @@ https://github.com/kinetiknz/cubeb/pull/600 + pthread_mutex_lock(&s->mtx); + if (!s->running || s->destroying) { + pthread_mutex_unlock(&s->mtx); -+ state = CUBEB_STATE_STOPPED; + break; + } + pthread_mutex_unlock(&s->mtx); @@ -848,8 +856,7 @@ https://github.com/kinetiknz/cubeb/pull/600 + * play-only stream or record-only stream + */ + -+ state = CUBEB_STATE_STOPPED; -+ break; ++ goto breakdown; + } + + while ((s->bufframes - ppending) >= s->nfr && rpending >= s->nfr) { @@ -865,7 +872,7 @@ https://github.com/kinetiknz/cubeb/pull/600 + nfr = s->data_cb(s, s->user_ptr, rptr, pptr, n); + if (nfr == CUBEB_ERROR) { + state = CUBEB_STATE_ERROR; -+ goto out; ++ goto breakdown; + } + if (pptr) { + float vol; @@ -902,7 +909,7 @@ https://github.com/kinetiknz/cubeb/pull/600 + */ + + state = CUBEB_STATE_STOPPED; -+ goto out; ++ goto breakdown; + } + } + } @@ -919,7 +926,7 @@ https://github.com/kinetiknz/cubeb/pull/600 + continue; + LOG("Error %d occured when polling playback and record fd", errno); + state = CUBEB_STATE_ERROR; -+ goto out; ++ goto breakdown; + } else if (nfds == 0) + continue; + @@ -927,7 +934,7 @@ https://github.com/kinetiknz/cubeb/pull/600 + (pfds[1].revents & (POLLERR | POLLHUP))) { + LOG("Error occured on playback, record fds"); + state = CUBEB_STATE_ERROR; -+ goto out; ++ goto breakdown; + } + + if (pfds[0].revents) { @@ -942,7 +949,7 @@ https://github.com/kinetiknz/cubeb/pull/600 + break; + } + state = CUBEB_STATE_ERROR; -+ goto out; ++ goto breakdown; + } + frames = n / s->play.frame_size; + pthread_mutex_lock(&s->mtx); @@ -963,7 +970,7 @@ https://github.com/kinetiknz/cubeb/pull/600 + if (errno == EAGAIN) + break; + state = CUBEB_STATE_ERROR; -+ goto out; ++ goto breakdown; + } + frames = n / s->record.frame_size; + rpending += frames; @@ -971,19 +978,26 @@ https://github.com/kinetiknz/cubeb/pull/600 + } + if (drain) { + state = CUBEB_STATE_DRAINED; -+ break; ++ goto breakdown; + } + } + -+out: -+ return state; ++ return 1; ++ ++breakdown: ++ pthread_mutex_lock(&s->mtx); ++ *new_state = s->state = state; ++ s->running = false; ++ pthread_mutex_unlock(&s->mtx); ++ return 0; +} + +static void * +oss_io_routine(void *arg) +{ + cubeb_stream *s = arg; -+ cubeb_state state = CUBEB_STATE_STARTED; ++ cubeb_state new_state; ++ int stopped; + + do { + pthread_mutex_lock(&s->mtx); @@ -993,15 +1007,11 @@ https://github.com/kinetiknz/cubeb/pull/600 + } + pthread_mutex_unlock(&s->mtx); + -+ state = CUBEB_STATE_STARTED; -+ s->state_cb(s, s->user_ptr, state); -+ -+ state = oss_audio_loop(s); -+ assert(state != CUBEB_STATE_STARTED); -+ ++ stopped = oss_audio_loop(s, &new_state); + if (s->record.fd != -1) + ioctl(s->record.fd, SNDCTL_DSP_HALT_INPUT, NULL); -+ s->state_cb(s, s->user_ptr, state); ++ if (!stopped) ++ s->state_cb(s, s->user_ptr, new_state); + + pthread_mutex_lock(&s->mtx); + pthread_cond_signal(&s->stopped_cv); @@ -1009,7 +1019,10 @@ https://github.com/kinetiknz/cubeb/pull/600 + pthread_mutex_unlock(&s->mtx); + break; + } -+ pthread_cond_wait(&s->doorbell_cv, &s->mtx); ++ while (!s->doorbell) { ++ pthread_cond_wait(&s->doorbell_cv, &s->mtx); ++ } ++ s->doorbell = false; + pthread_mutex_unlock(&s->mtx); + } while (1); + @@ -1061,6 +1074,7 @@ https://github.com/kinetiknz/cubeb/pull/600 + ret = CUBEB_ERROR; + goto error; + } ++ s->state = CUBEB_STATE_STOPPED; + s->record.fd = s->play.fd = -1; + s->nfr = latency_frames; + if (input_device != NULL) { @@ -1169,6 +1183,7 @@ https://github.com/kinetiknz/cubeb/pull/600 + LOG("Failed to create cv"); + goto error; + } ++ s->doorbell = false; + + if (s->play.fd != -1) { + if ((s->play.buf = calloc(s->bufframes, s->play.frame_size)) == NULL) { @@ -1196,6 +1211,7 @@ https://github.com/kinetiknz/cubeb/pull/600 +oss_stream_thr_create(cubeb_stream * s) +{ + if (s->thread_created) { ++ s->doorbell = true; + pthread_cond_signal(&s->doorbell_cv); + return CUBEB_OK; + } @@ -1211,11 +1227,16 @@ https://github.com/kinetiknz/cubeb/pull/600 +static int +oss_stream_start(cubeb_stream * s) +{ ++ s->state_cb(s, s->user_ptr, CUBEB_STATE_STARTED); + pthread_mutex_lock(&s->mtx); -+ if (!s->running && oss_stream_thr_create(s) != CUBEB_OK) { ++ /* Disallow starting an already started stream */ ++ assert(!s->running && s->state != CUBEB_STATE_STARTED); ++ if (oss_stream_thr_create(s) != CUBEB_OK) { + pthread_mutex_unlock(&s->mtx); ++ s->state_cb(s, s->user_ptr, CUBEB_STATE_ERROR); + return CUBEB_ERROR; + } ++ s->state = CUBEB_STATE_STARTED; + s->thread_created = true; + s->running = true; + pthread_mutex_unlock(&s->mtx);