2013-04-26 13 views
8

ho metodo che si prende cura del mio stato altoparlanti seguito:non possono controllare l'altoparlante iPad

AudioSession.h

enum { 
    kAudioSessionOverrideAudioRoute_None = 0, 
    kAudioSessionOverrideAudioRoute_Speaker = 'spkr' 
}; 

MiaClasse

@synthesize speakerEnabled; 

... 

- (void)setSpeakerEnabled:(BOOL)enable { 
speakerEnabled = enable; 
if(enable) { 
    UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; 
    AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute 
          , sizeof (audioRouteOverride) 
          , &audioRouteOverride); 
} else { 
    UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None; 
    AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute 
          , sizeof (audioRouteOverride) 
          , &audioRouteOverride); 
} 
} 

Tuttavia funziona solo su iPhone, per iPad - non succede nulla.

  • Quando si preme il pulsante: Speaker On, io entro a if(enable) e AudioSessionSetProperty riceve kAudioSessionOverrideAudioRoute_Speaker;

  • Quando si preme il pulsante: Speaker Off, io entro a else e AudioSessionSetProperty riceve kAudioSessionOverrideAudioRoute_None;

Ho iniziato a eseguire il debug e non ho trovato differenze tra i dispositivi.

Ho iPad2 iOS 6.1.

Mi sono perso qualcosa?

per favore, aiutami

Modifica

Come Lombax dice ho aggiunto su richiesta lancio AVAudioSession Categoria:

NSError *err = nil; 
    BOOL success = [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&err]; 

    if(!success){ 
     [MyLogger logc:MyLoggerLog format:"%@",[err localizedDescription]]; 
    } 

success = YES

ancora non funziona.

+0

'AudioSessionSetProperty' ha un valore di ritorno, hai controllare? – Sulthan

+0

Sì, restituisce 'OSStatus = 0' solo –

+0

Qual è il valore restituito dalla chiamata setCategory? E, se è NO, l'errore relativo – LombaX

risposta

8

Penso che si frainteso l'uso di questa proprietà. Speri di abilitare/disabilitare il tuo altoparlante. Questo non è esattamente l'intento di kAudioSessionProperty_OverrideAudioRoute. Piuttosto, influisce sul suono in uscita instradamento, in modo abbastanza limitato.

Questi sono i vari percorsi possibili uscita avaiable al iPhone

extern const CFStringRef kAudioSessionOutputRoute_LineOut   
extern const CFStringRef kAudioSessionOutputRoute_Headphones    
extern const CFStringRef kAudioSessionOutputRoute_BluetoothHFP   
extern const CFStringRef kAudioSessionOutputRoute_BluetoothA2DP  
extern const CFStringRef kAudioSessionOutputRoute_BuiltInReceiver 
extern const CFStringRef kAudioSessionOutputRoute_BuiltInSpeaker  
extern const CFStringRef kAudioSessionOutputRoute_USBAudio    
extern const CFStringRef kAudioSessionOutputRoute_HDMI    
extern const CFStringRef kAudioSessionOutputRoute_AirPlay 

Questi sono solo possibili rotte - quello realmente disponibile è dipendente dal contesto. Apple limita fortemente la tua capacità di determinare questi percorsi in-app poiché è qualcosa che l'utente deve controllare in modo coerente con il dispositivo. La maggior parte di questi sono determinati implicitamente dall'utente che collega/scollega l'hardware (cuffie, USB, HDMI, uscita di linea), e Apple non vuole che la tua app infastidisca le aspettative degli utenti qui.

L'airplay può essere selezionato utilizzandorouteButton se il contesto multimediale è corretto (e l'airplay è disponibile). Bluetooth può essere guidato da OverrideCategoryEnableBluetoothInput (which controls both input and output)

In particolare, si noti che kAudioSessionOutputRoute_BuiltInReceiver è l'altoparlante di basso livello sull'iPhone che si tiene all'orecchio quando si effettua una chiamata. Questa è la rotta di uscita audio predefinita per l'iPhone se un dispositivo esterno (ad es. Cuffie) non è collegato. kAudioSessionOutputRoute_BuiltInSpeaker è l'altoparlante "vivavoce" più forte nella parte inferiore del telefono.

è possibile reindirizzare da qualunque sia il predefinito corrente è a questo BuiltInSpeaker impostando una di queste proprietà di override:

key: kAudioSessionProperty_OverrideAudioRoute 
values: kAudioSessionOverrideAudioRoute_Speaker 
     : kAudioSessionOverrideAudioRoute_None 

Specifica se eseguire l'override percorso audio normale della categoria sessione audio.

key: kAudioSessionProperty_OverrideCategoryDefaultToSpeaker 
values: TRUE 
     : FALSE 

Specifica se per indirizzare l'audio al diffusore (anziché al ricevitore) quando nessun altro percorso audio, come ad esempio un auricolare, è collegato.

Entrambi sono progettati solo per essere utilizzati con la categoria Audio Session kAudioSessionCategory_PlayAndRecord.

Si noti che in entrambi i casi non si sta scegliendo tra una rotta di uscita, si sta solo sovrascrivendo il "percorso predefinito" a favore dell'altoparlante incorporato (rumoroso).

L'iPad, privo di telefono, non ha un tipo di altoparlante BuiltInReceiver. È la route predefinita, in assenza di gadget o airplay collegati, è esattamente la stessa BuiltInSpeaker. Pertanto, l'override non ha alcun effetto.

Supponendo che si stia veramente provando a disattivare l'audio nell'app, il modo in cui lo si ottiene dipende da molti altri aspetti della progettazione dell'app. Se si desidera disattivare l'audio del dispositivo , Apple preferisce che l'utente lo controlli tramite l'interruttore circolare/silenzioso. Sembra che non lo avrebbero in nessun altro modo:

Ho ricevuto una risposta da Apple su questo. Hanno detto che non hanno e non hanno mai fornito un metodo per rilevare l'interruttore di silenziamento dell'hardware e non hanno intenzione di farlo.https://stackoverflow.com/a/8009073/1375695

"L'impostazione degli altoparlanti è un overide per il dispositivo, non per un determinato suono"
http://lists.apple.com/archives/coreaudio-api/2009/Mar/msg00300.html

+0

Grazie per "cancellare" la mia mente. Im non guru iOS :) e la tua descrizione è chiara. Ad ogni modo, se in questo modo non funziona su iPad posso usare la soluzione alternativa, almeno, muto Speaker come set Volume 0 e vice versa al 100% sul clic su? –

+0

@MaximShoustin, dipende dal tuo progetto - ad esempio se usi AVAudioPlayer puoi impostare la proprietà 'volume' su 0 – foundry

+0

Io uso il protocollo SIP e mostrare video/audio da altri dispositivi (codec x264) –

2

Hai provato a impostare la categoria audio prima della riproduzione? Mi ricordo che ho avuto lo stesso problema qualche tempo fa, e ho trovato questa soluzione (regolare la categoria)

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; 

Non ho trovato nulla sulla documentazione, penso che su iPad è necessario impostare la categoria perché iPhone e l'iPad si differenzia per un dettaglio: su iPhone, l'interruttore hardware sinistro può disattivare l'altoparlante. Su iPad, lo stesso interruttore viene utilizzato per bloccare la rotazione.

Prova e fammi sapere

EDIT:

link utile:

http://developer.apple.com/library/ios/#documentation/Audio/Conceptual/AudioSessionProgrammingGuide/Cookbook/Cookbook.html

Problemi correlati