Git Product home page Git Product logo

Comments (9)

simlay avatar simlay commented on August 16, 2024 1

I think this is a Info.plist issue. Through a bit of work, I was able to get Host num input devices: 1 on a device.

I had to add microphone to the list of UIRequiredDeviceCapabilities. I also added NSMicrophoneUsageDescription but I think you may have this one as it's mentioned in permission_handler. Once doing that, the "This app wants to use your microphone" modal popped up.

Note: The same Info.plist doesn't change the result on my iOS simulator (Host num input devices: 0) but I've got other things to work on.

Hope that helps.

from cpal.

yury avatar yury commented on August 16, 2024 1

@tGrothmannFluffy you may also need to configure and activate AVAudioSession. Set category to play and record

from cpal.

tGrothmannFluffy avatar tGrothmannFluffy commented on August 16, 2024 1

Oh goodness gracious!
Your comment pointed me to the right solution. It worked after I added :

import AVFAudio

...

#if os(iOS)
let audio_session = AVAudioSession.sharedInstance();
do {
    try audio_session.setCategory(AVAudioSession.Category.playAndRecord);
    try audio_session.setActive(true);
} catch {
    print(error);
}
#endif

into AppDelegate.swift.

from cpal.

tGrothmannFluffy avatar tGrothmannFluffy commented on August 16, 2024

update:

When I get the audio devices in Dart using audio_service:

final session = await AudioSession.instance;
List<AudioDevice> audioDevices = (await session.getDevices()).toList();

for (var device in audioDevices) {
  print("Device: ${device.name}, input: ${device.isInput}, type: ${device.type}");
}

the mic is found:

Device: MicrophoneBuiltIn, input: true, type: AudioDeviceType.builtInMic
Device: Speaker, input: false, type: AudioDeviceType.builtInSpeaker

from cpal.

tGrothmannFluffy avatar tGrothmannFluffy commented on August 16, 2024

Thanks for the investigation!

I added

<key>UIRequiredDeviceCapabilities</key>
<array>
   <string>microphone</string>
</array>

to ios/Runner/Info.plist but unfortunately that didn't fix it.

It might be a permissions issue, but the microphone permission modal pops up and flutter has microphone permissions. Just the rust library it links maybe doesn't 🤔

from cpal.

tGrothmannFluffy avatar tGrothmannFluffy commented on August 16, 2024

I'm still investigating this issue and I have some news.
I've tested several versions on simulators and the problem starts with iOS 17.0

iphone  8 on iOS 15.0 - works
iphone 12 on iOS 16.0 - works
iphone 14 on iOS 16.4 - works
iphone 11 on iOS 17.0 - doesn't work
iphone 14 on iOS 17.0 - doesn't work
iphone 15 on iOS 17.2 - doesn't work

from cpal.

yury avatar yury commented on August 16, 2024

@tGrothmannFluffy I don't know your app, but if you want play nice with other apps that are currently in background, it is better to activate your audio session on demand and not in AppDelegate app start. Otherwise, for instance, Apple Music will stop playing when your app starts and may be that behavior your users would not like.

from cpal.

tGrothmannFluffy avatar tGrothmannFluffy commented on August 16, 2024

Thanks for the help!
Yes, that makes absolute sense. It's a Flutter app (Dart) using a Rust library for audio (via flutter_rust_bridge). It would be best to set the session to active in Rust. Unfortunately I don't know how to activate the session outside of Swift code at the moment.

from cpal.

tGrothmannFluffy avatar tGrothmannFluffy commented on August 16, 2024

Ok, turns out using audio_session in Dart/Flutter works:

final session = await AudioSession.instance;
await session.configure(const AudioSessionConfiguration.music().copyWith(
  avAudioSessionCategory: AVAudioSessionCategory.playAndRecord,
));
await session.setActive(true);

But I wonder, isn't this something cpal should do when opening a stream?

from cpal.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.