iOS: Route audio-IN thru jack, audio-OUT thru inbuilt speaker - ios

My project involves a magnetic card reader device that plugs into the phono socket (ie only uses microphone)
Can I get my project to output sound through the inbuilt speaker while simultaneously listening for input from the device?
Research suggests this is not possible:
iPhone audio playback: force through internal speaker?
Force iPhone to output through the speaker, while recording from headphone mic
Audio Session Services: kAudioSessionProperty_OverrideAudioRoute with different routes for input & output
The only way round I can see is actually changing the audio session every time I wish to emit a sound.
Is this really the only option? And is it practical to do this? How long would it take for the audio session to reconfigure itself?

Related

Record device audio output with AudioUnit

We need to record the device audio output from cable or bluetooth headset speakers. For example if user listens to some song when Music app runs in background we want to record this song. Is it possible to implement output recording with AudioUnit? We use PalayAndRecord category for shared audioSession with AVAudioSessionCategoryOptionMixWithOthers option.
No, in general you can not listen to the output from another app. There is inter app audio and audio unit technology that enables this, but the connection must be arranged by both apps. It is not possible to just eavesdrop on whatever the user outputs from the device.

iOS - Audio Output Endpoint Routing

Is there a way create a virtual audio output device that would make it show up in the Music app's or Spotify's output options? Alternatively, is there a way to intercept the audio stream and then force audio output to something unused (say, open headphone port)?
What I want to do is take the raw audio stream, encode/compress it via a codec, and then send over BLE (not BT Classic). Ideally my "device", or service, would show up in the output options of the music/Spotify apps

How to detect active audio source of car bluetooth in iOS app

I am working to play some voice messages from iPhone to car bluetooth audio and are testing with Lexus RX350, which supports A2DP and HFP. In our case, A2DP is preferred. However, I can only hear the sound when car is using bluetooth as audio source. When listening to CD or radio, no sound from iPhone is actually played over car audio system.
So, what I want to do is:
Use A2DP when bluetooth is the active audio source
Otherwise use HFP
I use AVAudioPlayer to play audio with AVAudioSessionCategoryPlayback as audio session category. It will always succeed as long as the bluetooth connection is established, no matter whether the car audio is on radio, CD or bluetooth. There is no route change notification when switch between audio sources, therefore I don’t know when we shall switch to HFP. Any suggestions?
Btw, music players like Spotify, Pandora, will pause when switch away from bluetooth audio and resume when switch back, Google Maps will use A2DP when bluetooth audio is active and use HFP if not, so I think there should be a way to detect the change

iOS: Is it possible to send audio out both headphones and speakers at the same time?

We're looking to send some serial data out from the headphone jack, but would like to still be able to play audio from the speakers. Is it possible to send output to both? If so, is it possible to send different audio to each?
Not as far as I'm aware. You can get programatic notification of when the routing has changed (i.e. when someone connects a headphone cable), but you are unable to specify which device(s) to use for output.

AudioSession input from bluetooth output to line out or speaker

Once an audio session has been set up the following code allows bluetooth input.
UInt32 allowBluetoothInput = 1;
AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryEnableBluetoothInput, sizeof (allowBluetoothInput), &allowBluetoothInput);
This code looks like it only allows bluetooth input however this code also routes the audio output to the bluetooth device (in the case of a bluetooth headset). I would like to route the audio output out of the line out or speaker when the input is coming from a bluetooth device. I just want to get audio input from a bluetooth device, I do not want to output audio via bluetooth.
Is this behaviour possible?
as of iOS 5 this behaviour is not possible, quoting apple technical support
Bluetooth devices are not "Jacked In" devices and therefore any other
audio routing must be user picked and cannot be changed in code. To do
this, you can use the functionality of the MPVolumeView which will
have an extra routing widget viewable allowing the user to specify the
routing of the output.
There's a older thread on the Core Audio mailing list regarding this
functionality but behavior hasn't changed:
http://lists.apple.com/archives/coreaudio-api/2009/Oct/msg00030.html
MPVolumeView reference:
http://developer.apple.com/library/ios/#documentation/mediaplayer/reference/MPVolumeView_Class/Reference/Reference.html
However the MPVolumeView does not allow you to route the input and output independently.

Resources