La lecture de l'audio par le biais de haut (appel téléphonique) haut-parleur

Je suis en train d'essayer d'obtenir l'audio dans mon appli pour jouer par la partie supérieure du haut-parleur de l'iPhone, celui que vous appuyez sur à votre oreille pendant un appel téléphonique. Je sais que c'est possible, parce que j'ai joué à un jeu sur l'App Store (Le"hold-up" par "tap tap tap") qui simule les appels téléphoniques et ne fait que cela.

J'ai fait beaucoup de recherches en ligne, mais je vais avoir une surprise du mal à trouver quelqu'un qui a même discuté de la possibilité. L'écrasante majorité des postes semblent être sur le haut-parleur mains libres vs branché des écouteurs, (comme cette et cette et cette), plutôt que par le haut "appel téléphonique" haut-parleur vs le haut-parleur mains libres. (Une partie de ce problème pourrait être de ne pas avoir un bon nom pour elle: "haut-parleur de téléphone", on entend souvent le haut-parleur mains libres au bas de l'appareil, etc, il est donc difficile de faire un vraiment bien ciblés de recherche). J'ai regardé dans Apple Audio Session Category Route Overrides, mais ces nouveau semble (corrigez-moi si je me trompe) ne traitent qu'avec le haut-parleur mains libres sur le fond, pas le haut-parleur en haut du téléphone.

Je l'ai trouvé UN post qui semble être à ce sujet: lien. Il fournit même un tas de code, donc je pensais que j'étais à la maison gratuitement, mais maintenant je n'arrive pas à obtenir le code du travail. Pour des raisons de simplicité j'ai juste copié le DisableSpeakerPhone méthode (qui, si je comprends bien, devrait être le seul à le re-routage audio pour le haut-parleur) dans mon viewDidLoad pour voir si ça marcherait, mais la première "assert" ligne échoue, et la musique continue de jouer la bas. (J'ai aussi importé le AudioToolbox Cadre, comme le suggère le commentaire, si ce n'est pas le problème).

Ici est le principal bloc de code, je travaille avec (c'est ce que j'ai copié dans mon viewDidLoad pour tester), mais il ya un peu plus de méthodes dans l'article que j'ai lié à:

void DisableSpeakerPhone () {
    UInt32 dataSize = sizeof(CFStringRef);
    CFStringRef currentRoute = NULL;
    OSStatus result = noErr;

    AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &dataSize, &currentRoute);

    //Set the category to use the speakers and microphone.
    UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord;
    result = AudioSessionSetProperty (
                                      kAudioSessionProperty_AudioCategory,
                                      sizeof (sessionCategory),
                                      &sessionCategory
                                      );
    assert(result == kAudioSessionNoError);

    Float64 sampleRate = 44100.0;
    dataSize = sizeof(sampleRate);
    result = AudioSessionSetProperty (
                                      kAudioSessionProperty_PreferredHardwareSampleRate,
                                      dataSize,
                                      &sampleRate
                                      );
    assert(result == kAudioSessionNoError);

    //Default to speakerphone if a headset isn't plugged in.
    //Overriding the output audio route

    UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None; 
    dataSize = sizeof(audioRouteOverride);
    AudioSessionSetProperty(
                            kAudioSessionProperty_OverrideAudioRoute,
                            dataSize,
                            &audioRouteOverride);

    assert(result == kAudioSessionNoError);

    AudioSessionSetActive(YES);
} 

Donc ma question est: est-ce quelqu'Un) m'aider à comprendre pourquoi ce code ne fonctionne pas, ou B) d'offrir une meilleure suggestion pour être en mesure d'appuyer sur un bouton et acheminer l'audio jusqu'à la partie supérieure du haut-parleur?

PS je suis de plus en plus familiers avec iOS programmation, mais c'est ma première incursion dans le monde de la AudioSessions et tels, de sorte que les détails et les exemples de code sont très appréciés! Merci pour votre aide!

Mise à JOUR:

De la suggestion de "Il Était" (ci-dessous) j'ai enlevé le code cité ci-dessus et l'a remplacé par:

[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayAndRecord error:nil];
[[AVAudioSession sharedInstance] setActive: YES error:nil];

au début de viewDidLoad. Il ne fonctionne toujours pas, bien que, je veux dire l'audio est toujours de sortir de l'enceinte du bas du téléphone à la place du récepteur vers le haut). Apparemment, le comportement par défaut devrait être pour AVAudioSessionCategoryPlayAndRecord pour envoyer la sortie audio du récepteur sur son propre, donc quelque chose est toujours mal.

Plus précisément ce que je fais avec ce code est en cours de lecture audio par le biais de l'iPod Lecteur de Musique (initialisé à droite après le AVAudioSession lignes ci-dessus dans viewDidLoad, pour ce que ça vaut):

_musicPlayer = [MPMusicPlayerController iPodMusicPlayer];

et les médias pour iPod, Lecteur de Musique est choisie par un MPMediaPickerController:

- (void) mediaPicker: (MPMediaPickerController *) mediaPicker didPickMediaItems: (MPMediaItemCollection *) mediaItemCollection {
    if (mediaItemCollection) {
        [_musicPlayer setQueueWithItemCollection: mediaItemCollection];
        [_musicPlayer play];
    }

    [self dismissViewControllerAnimated:YES completion:nil];
}

Tout cela semble assez simple pour moi, j'ai pas d'erreurs ou d'avertissements, et je sais que le Sélecteur de support et Lecteur de Musique fonctionne correctement parce que la bonne chansons de commencer à jouer, c'est juste de la mauvaise haut-parleur. Pourrait-il y avoir un "jeu de médias à l'aide de cette AudioSession" méthode ou quelque chose? Ou est-il un moyen de vérifier ce que l'audio de la session de la catégorie active, afin de confirmer que rien n'aurait pu basculer en arrière ou quelque chose? Est-il un moyen de dire catégoriquement le code pour UTILISER le récepteur, plutôt que de compter sur le défaut de le faire? Je sens que je suis sur la ligne d'une verge, j'ai juste besoin de traverser cette finale peu...

EDIT: je viens de penser à une théorie, selon laquelle il est quelque chose au sujet de l'iPod Lecteur de Musique qui ne veulent pas jouer hors du récepteur. Mon raisonnement: il est possible de définir une chanson pour démarrer la lecture à travers les officiels application iPod et puis de façon ajuster (pause, sauter, etc) par le biais de l'application que je suis en développement. La lecture en continu à partir d'une application à l'autre m'a fait penser que peut-être la Musique de l'iPod Player dispose de son propre audio paramètres de l'itinéraire, ou peut-être qu'il ne s'arrête pas à vérifier les paramètres dans la nouvelle application? Quelqu'un qui sait de quoi ils parlent pense que cela pourrait-il être quelque chose comme ça?

Essayé tout à l'nuking l'affirme et de voir ce qui se passe?
Commentaire-les tous, et c'est comme il n'y a pas de code il y a tout: de l'audio passe par le haut-parleur au bas. J'imagine que c'est parce que le même problème à l'origine de la affirme à l'échec, je suis juste pas assez d'expérience pour savoir ce que cela pourrait être.
Je ne suis pas non plus... Bonne chance!
stackoverflow.com/questions/39159695/...

OriginalL'auteur Nerrolken | 2013-08-02