Skip to content

Commit 5516121

Browse files
authored
fix: wants vs has (#1017)
1 parent 6af9094 commit 5516121

9 files changed

Lines changed: 410 additions & 107 deletions

File tree

apps/common-app/src/examples/Record/Record.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
import React, { FC, useCallback, useEffect, useState } from 'react';
1+
import React, { FC, useCallback, useEffect, useState, useRef } from 'react';
22
import { Alert, Text, View } from 'react-native';
33
import {
44
AudioBuffer,
55
AudioManager,
66
useAudioInput,
7+
AudioBufferSourceNode,
78
} from 'react-native-audio-api';
89

910
import { Button, Container, Select } from '../../components';
@@ -23,6 +24,7 @@ const Record: FC = () => {
2324

2425
const [status, setStatus] = useState<Status>(Status.Idle);
2526
const [capturedBuffers, setCapturedBuffers] = useState<AudioBuffer[]>([]);
27+
const sourceNodesRef = useRef<AudioBufferSourceNode[]>([]);
2628

2729
const verifyPermissions = async () => {
2830
const recPerm = await AudioManager.requestRecordingPermissions();
@@ -197,6 +199,7 @@ const Record: FC = () => {
197199
source.connect(audioContext.destination);
198200
source.start(nextStartAt);
199201
nextStartAt += buffer.duration;
202+
sourceNodesRef.current.push(source);
200203
});
201204

202205
setStatus(Status.Playback);
@@ -225,6 +228,10 @@ const Record: FC = () => {
225228
useEffect(() => {
226229
return () => {
227230
audioRecorder.stop();
231+
sourceNodesRef.current.forEach((source) => {
232+
source.disconnect();
233+
});
234+
sourceNodesRef.current = [];
228235
};
229236
}, []);
230237

apps/fabric-example/ios/FabricExampleTests/IOSAudioRecorderTests.mm

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,36 @@ void setRecorderState(RecorderState state)
241241
{
242242
return filePath_;
243243
}
244+
245+
bool fileOutputEnabledIntent() const
246+
{
247+
return fileOutputEnabled_.load(std::memory_order_acquire);
248+
}
249+
250+
bool fileOutputConfigured() const
251+
{
252+
return fileOutputConfigured_.load(std::memory_order_acquire);
253+
}
254+
255+
bool callbackOutputEnabledIntent() const
256+
{
257+
return callbackOutputEnabled_.load(std::memory_order_acquire);
258+
}
259+
260+
bool callbackOutputConfigured() const
261+
{
262+
return callbackOutputConfigured_.load(std::memory_order_acquire);
263+
}
264+
265+
bool connectionEnabledIntent() const
266+
{
267+
return isConnected_.load(std::memory_order_acquire);
268+
}
269+
270+
bool connectionConfigured() const
271+
{
272+
return connectedConfigured_.load(std::memory_order_acquire);
273+
}
244274
};
245275

246276
@interface IOSAudioRecorderTests : XCTestCase {
@@ -433,6 +463,43 @@ - (void)testStartPreparesMonoCallbackAgainstResolvedMultichannelInputFormat
433463
XCTAssertTrue(self.nativeRecorder.lastInputArmed);
434464
}
435465

466+
- (void)testEnableFileOutputWhileIdleTracksIntentWithoutLiveWriter
467+
{
468+
auto enableResult = _recorder->enableFileOutput([self validFileProperties]);
469+
470+
XCTAssertTrue(enableResult.is_ok());
471+
XCTAssertTrue(_recorder->fileOutputEnabledIntent());
472+
XCTAssertFalse(_recorder->fileOutputConfigured());
473+
XCTAssertFalse(_recorder->usesFileOutput());
474+
XCTAssertEqual(_recorder->getCurrentDuration(), 0.0);
475+
476+
_recorder->clearOnErrorCallback();
477+
}
478+
479+
- (void)testSetOnAudioReadyWhileIdleTracksIntentWithoutLiveCallback
480+
{
481+
auto callbackResult = _recorder->setOnAudioReadyCallback(48000, 256, 1, 99);
482+
483+
XCTAssertTrue(callbackResult.is_ok());
484+
XCTAssertTrue(_recorder->callbackOutputEnabledIntent());
485+
XCTAssertFalse(_recorder->callbackOutputConfigured());
486+
XCTAssertFalse(_recorder->usesCallback());
487+
}
488+
489+
- (void)testConnectWhileIdleTracksIntentWithoutLiveConnection
490+
{
491+
auto context =
492+
std::make_shared<OfflineAudioContext>(2, 512, 44100.0f, nullptr, RuntimeRegistry{});
493+
context->initialize();
494+
auto adapter = context->createRecorderAdapter();
495+
496+
_recorder->connect(adapter);
497+
498+
XCTAssertTrue(_recorder->connectionEnabledIntent());
499+
XCTAssertFalse(_recorder->connectionConfigured());
500+
XCTAssertFalse(_recorder->isConnected());
501+
}
502+
436503
- (void)testStartDoesNotAttemptToManageSessionWhenOwnershipIsExternal
437504
{
438505
self.sessionManager.shouldManageSession = NO;
@@ -491,6 +558,38 @@ - (void)testStopSucceedsAfterStartAndResetsState
491558
XCTAssertEqual(std::get<2>(stopResult.unwrap()), 0);
492559
}
493560

561+
- (void)testStopClearsConfiguredStateButPreservesConfiguredIntent
562+
{
563+
self.audioEngine.state = AudioEngineStateRunning;
564+
auto context =
565+
std::make_shared<OfflineAudioContext>(2, 512, 44100.0f, nullptr, RuntimeRegistry{});
566+
context->initialize();
567+
auto adapter = context->createRecorderAdapter();
568+
569+
XCTAssertTrue(_recorder->enableFileOutput([self validFileProperties]).is_ok());
570+
XCTAssertTrue(_recorder->setOnAudioReadyCallback(48000, 256, 1, 99).is_ok());
571+
_recorder->connect(adapter);
572+
573+
auto startResult = _recorder->start("");
574+
XCTAssertTrue(startResult.is_ok());
575+
XCTAssertTrue(_recorder->fileOutputConfigured());
576+
XCTAssertTrue(_recorder->callbackOutputConfigured());
577+
XCTAssertTrue(_recorder->connectionConfigured());
578+
579+
auto stopResult = _recorder->stop();
580+
581+
XCTAssertTrue(stopResult.is_ok());
582+
XCTAssertTrue(_recorder->fileOutputEnabledIntent());
583+
XCTAssertFalse(_recorder->fileOutputConfigured());
584+
XCTAssertFalse(_recorder->usesFileOutput());
585+
XCTAssertTrue(_recorder->callbackOutputEnabledIntent());
586+
XCTAssertFalse(_recorder->callbackOutputConfigured());
587+
XCTAssertFalse(_recorder->usesCallback());
588+
XCTAssertTrue(_recorder->connectionEnabledIntent());
589+
XCTAssertFalse(_recorder->connectionConfigured());
590+
XCTAssertFalse(_recorder->isConnected());
591+
}
592+
494593
- (void)testFileOutputSmokeTest
495594
{
496595
self.audioEngine.state = AudioEngineStateRunning;

apps/fabric-example/ios/Podfile.lock

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2476,7 +2476,7 @@ EXTERNAL SOURCES:
24762476

24772477
SPEC CHECKSUMS:
24782478
FBLazyVector: c00c20551d40126351a6783c47ce75f5b374851b
2479-
hermes-engine: 110b8efcd560ee96f1b25506f44de5dac81a8b7a
2479+
hermes-engine: 91023181d4bc5948b457de5314623fbfe4f8604e
24802480
RCTDeprecation: 3bb167081b134461cfeb875ff7ae1945f8635257
24812481
RCTRequired: 74839f55d5058a133a0bc4569b0afec750957f64
24822482
RCTSwiftUI: 87a316382f3eab4dd13d2a0d0fd2adcce917361a
@@ -2485,7 +2485,7 @@ SPEC CHECKSUMS:
24852485
React: 1b1536b9099195944034e65b1830f463caaa8390
24862486
React-callinvoker: 6dff6d17d1d6cc8fdf85468a649bafed473c65f5
24872487
React-Core: 00faa4d038298089a1d5a5b21dde8660c4f0820d
2488-
React-Core-prebuilt: 9484d565c2a73554e0ad6feaf2663d91044b7fed
2488+
React-Core-prebuilt: a6d614de037caff7898424dfc22915ec792de921
24892489
React-CoreModules: a17807f849bfd86045b0b9a75ec8c19373b482f6
24902490
React-cxxreact: c7b53ace5827be54048288bce5c55f337c41e95f
24912491
React-debug: e1f00fcd2cef58a2897471a6d76a4ef5f5f90c74
@@ -2549,7 +2549,7 @@ SPEC CHECKSUMS:
25492549
ReactAppDependencyProvider: 5787b37b8e2e51dfeab697ec031cc7c4080dcea2
25502550
ReactCodegen: d07ee3c8db75b43d1cbe479ae6affebf9925c733
25512551
ReactCommon: fe2a3af8975e63efa60f95fca8c34dc85deee360
2552-
ReactNativeDependencies: 9bccac470fdc394968cb9cba9b0e9bb9a1a38bf1
2552+
ReactNativeDependencies: 4d5ce2683b6d74f7c686bf90a88c7d381295cf3c
25532553
RNAudioAPI: 6f6c369c1df31fc8205cbc6f0c3bcb7322e9cfa9
25542554
RNGestureHandler: 187c5c7936abf427bc4d22d6c3b1ac80ad1f63c0
25552555
RNReanimated: 64f4b3b33b48b19e0ba76a352571b52b1e931981

0 commit comments

Comments
 (0)