首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在一个应用程序中切换多个AVAudioSession吐露?

如何在一个应用程序中切换多个AVAudioSession吐露?
EN

Stack Overflow用户
提问于 2022-07-08 07:25:39
回答 1查看 140关注 0票数 1

我有一个项目的反应-本机,我正在使用反应本地视频库提供视频在我的应用程序。我在应用程序中有很多视频组件,但它们必须有不同的AVAudioSession类别和选项。但当我第一次将类别和选项设置为AVAudioSession时,它适用于我应用程序中的每个视频实体。

配置音频的代码如下:

代码语言:javascript
复制
- (void)configureAudio
{
    AVAudioSession *session = [AVAudioSession sharedInstance];
    AVAudioSessionCategory category = nil;
    AVAudioSessionCategoryOptions options = nil;

    if([_ignoreSilentSwitch isEqualToString:@"ignore"]) {
      category = AVAudioSessionCategoryPlayback;
    } else if([_ignoreSilentSwitch isEqualToString:@"obey"]) {
      category = AVAudioSessionCategoryAmbient;
    }

    if([_mixWithOthers isEqualToString:@"mix"]) {
      options = AVAudioSessionCategoryOptionMixWithOthers;
    } else if([_mixWithOthers isEqualToString:@"duck"]) {
      options = AVAudioSessionCategoryOptionDuckOthers;
    } 

    if (category != nil && options != nil) {
      [session setCategory:category withOptions:options error:nil];
    } else if (category != nil && options == nil) {
      [session setCategory:category error:nil];
    } else if (category == nil && options != nil) {
      [session setCategory:session.category withOptions:options error:nil];
    }
}

调用此方法的代码:

代码语言:javascript
复制
- (void)setIgnoreSilentSwitch:(NSString *)ignoreSilentSwitch
{
  _ignoreSilentSwitch = ignoreSilentSwitch;
  [self configureAudio];
  [self applyModifiers];
}

- (void)setPaused:(BOOL)paused
{
  if (paused) {
    [_player pause];
    [_player setRate:0.0];
    
  } else {
    [self configureAudio];

    if (@available(iOS 10.0, *) && !_automaticallyWaitsToMinimizeStalling) {
      [_player playImmediatelyAtRate:_rate];
    } else {
      [_player play];
      [_player setRate:_rate];
    }
    [_player setRate:_rate];
  }
  
  _paused = paused;
}

当用户每次调用setIgnoreSilentSwitch('some‘)或setPaused(false)时,都必须更改配置,但它不会发生。

EN

回答 1

Stack Overflow用户

发布于 2022-09-08 02:30:19

在应用程序中使用多个AVAudioSession似乎是不可能的。我通过单元测试证实了这一点。

代码语言:javascript
复制
class ASession: AVAudioSession {
    private static let instance = ASession()
    override class func sharedInstance() -> AVAudioSession { instance }

    override var category: AVAudioSession.Category { .playAndRecord }
    override var categoryOptions: AVAudioSession.CategoryOptions { [.duckOthers, .allowBluetooth] }
}

class BSession: AVAudioSession {
    private static let instance = BSession()
    override class func sharedInstance() -> AVAudioSession { instance }

    override var category: AVAudioSession.Category { .playback }
    override var categoryOptions: AVAudioSession.CategoryOptions { [.defaultToSpeaker, .duckOthers] }
}

class AVAudioSessionTests: XCTestCase {

    func tesIftMultipleAudioSessionsAvailable() {
        XCTAssertEqual(ASession.sharedInstance().category, .playAndRecord)  // Passed
        XCTAssertEqual(ASession.sharedInstance().categoryOptions, [.mixWithOthers, .duckOthers, .allowBluetooth])  // Passed

        // XCTAssertEqual failed: ("AVAudioSessionCategory(_rawValue: AVAudioSessionCategoryPlayAndRecord)") is not equal to ("AVAudioSessionCategory(_rawValue: AVAudioSessionCategoryPlayback)")
        XCTAssertEqual(BSession.sharedInstance().category, .playback)
        // XCTAssertEqual failed: ("AVAudioSessionCategoryOptions(rawValue: 7)") is not equal to ("AVAudioSessionCategoryOptions(rawValue: 11)") 
        XCTAssertEqual(BSession.sharedInstance().categoryOptions, [.defaultToSpeaker, .mixWithOthers, .duckOthers])
    }
}

另外,我在另一个问题中提到,“在iOS中运行的每个应用程序都有一个音频会话”。在答案中提到的苹果文档中,我再也找不到相同的句子了,但它可能就在那里,功能本身到今天还没有改变。

https://stackoverflow.com/a/31815855/4834226

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72908056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档