2010-06-17 12 views
8

Je sais que je dois régler la AudioSession sur la catégorie 'lecture', ce qui permet d'entendre l'audio même lorsque l'interrupteur de sourdine est activé. C'est ce que je fais, mais le son est toujours coupé quand le commutateur est activé.PlaySystemSound avec l'interrupteur de mise en sourdine

UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback; 
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,sizeof(sessionCategory), &sessionCategory); 

SystemSoundID soundID; 
NSString *path = [[NSBundle mainBundle] pathForResource:soundString ofType:@"wav"];  

AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:path],&soundID); 
AudioServicesPlaySystemSound (soundID); 


EDIT: par ailleurs, l'application est un SoundPad. Jouer le son est le seul but de l'application. Voici ce que Apple Doc dit à ce sujet:

Utilisez cette catégorie pour une application dont la lecture audio est de première importance . Votre audio joue même avec l'écran est verrouillé et avec le commutateur Ring/Silent réglé sur silencieux.


EDIT 2: avec l'interrupteur de sourdine sur, le son même coutume de jouer à travers les écouteurs. Je sais que l'utilisateur est roi. Je sais que le commutateur de sourdine a son but. Ceci n'est pas la question. J'essaie d'obtenir une réponse sur le fait que la définition de la catégorie AudioSession à kAudioSessionCategory_MediaPlayback n'a pas le résultat attendu.


EDIT 3: suite à la suggestion de Jonathan Watmough, je mis la propriété AudioServiceskAudioServicesPropertyIsUISound, mais toujours pas de chance. Est-ce que je manque quelque chose?

// set the session property 
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback; 
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,sizeof(sessionCategory), &sessionCategory); 

// creates soundID 
SystemSoundID soundID; 
NSString *path = [[NSBundle mainBundle] pathForResource:soundString ofType:@"wav"];  
AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:path],&soundID); 

// Jonathan Watmough suggestion 
UInt32 flag = 0; 
AudioServicesSetProperty(kAudioServicesPropertyIsUISound, sizeof(UInt32), &soundID, sizeof(UInt32), &flag); 

AudioServicesPlaySystemSound (soundID); 
+0

carrément malveillant Semble jouer son lorsque l'utilisateur a coupé son téléphone. Si les choses au niveau du système ne le font pas, pourquoi votre application devrait-elle l'être? À moins que votre application ne soit un "avertissement de fusion de réacteur nucléaire", je ne vois pas pourquoi votre application devrait être autorisée à interrompre une réunion, un mariage ou un enterrement avec du bruit. –

+0

À partir de l'Apple Doc: «Utilisez cette catégorie pour une application dont la lecture audio est primordiale Votre lecture audio se fait même avec l'écran verrouillé et avec le commutateur Ring/Silent réglé sur silent. – samvermette

+0

Alors, qu'est-ce qui vous paraît le plus important? Je suppose qu'à la fin de la journée, ils ont ouvert votre application car j'ai oublié que votre application ne peut pas exécuter des actions sans les ouvrir mais encore quand ils ont leur téléphone en sourdine et n'obtiennent aucun bruit qui semble être le comportement désiré. –

Répondre

4

Eh bien, pour ajouter sur la réponse de Jonathan Watmough, en effet, il ne semble pas possible de laisser AudioServicesSystemSound écraser le commutateur de silencieux. Ce que j'ai fini par faire est d'utiliser OpenAL pour jouer les sons, qui vont bien jouer après la catégorie de session audio que vous spécifiez. Voici comment je configurer la session Audio:

AudioSessionInitialize(NULL, NULL, NULL, NULL); 
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback; 
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,sizeof(sessionCategory), &sessionCategory); 
AudioSessionSetActive(YES); 

Pour jouer les sons, je Finch, un simple lecteur effet sonore basé sur OpenAL pour iPhone.

+0

Merci pour votre réponse, j'ai fait un test et vous avez raison d'utiliser Finch pour utiliser O penAL vous permet de jouer un son même si la sourdine est définie à l'aide de kAudioSessionCategory_MediaPlayback (comme indiqué dans la documentation de cette constante). – yonel

1

Je ne l'ai pas encore essayé, mais vous pouvez changer la propriété sur votre son chargé:

kAudioServicesPropertyIsUISound Une valeur UInt32, où 1 signifie que, pour le fichier audio spécifié par un son système transmis dans le paramètre inSpecifier, le serveur de son système respecte le paramètre utilisateur dans la préférence Effets sonores et est silencieux lorsque l'utilisateur désactive les effets sonores. Cette propriété est définie sur 1 par défaut. Réglez-le sur 0 pour que le son du système soit toujours lu lorsqu'il est transmis à AudioServicesPlaySystemSound, quel que soit le réglage de l'utilisateur dans les préférences sonores. Disponible sur iPhone OS 2.0 et versions ultérieures. Déclaré dans AudioServices.h.

Je m'attendrais à avoir tout fait correctement, mettre la propriété à 0 dira au système que votre son est un son d'application, et non un son 'UI' et donc sujet à l'inhibition.

EDIT: Il semblerait que cela ne puisse pas être fait avec les sons du système. Si vous passez par OpenAL, vous serez évidemment en mesure de jouer avec le jeu de boutons muet.

J'ai construit l'exemple SysSound et ajouté le code suivant pour définir le drapeau comme vous l'avez fait ci-dessus, et il ne joue pas du tout en mode silencieux.

// Set the sound to always play 
    int setTo0 = 0; 
    AudioServicesSetProperty(kAudioServicesPropertyIsUISound,0,nil, 
          4,&setTo0);
+0

la pensée qui était mais Nope :(Voir 3 modifier dans mon post – samvermette

+0

Oui c'est ce que je pensais d'origine. S'il vous plaît souligner la réponse sur le fait qu'il ne peut pas être fait avec SystemSound (suggérant OpenAL) pour que je puisse accepter votre réponse . Merci beaucoup pour aider à! – samvermette

+0

Ce code est erroné. Vous devez passer un SystemSoundID comme les deuxième et troisième paramètres. – matt

0

Vous appelez setActive:error: pour la AVAudioSession quelque part non? Voici le code que j'utilise pour initialiser. Mais je n'utilise pas les sons du système, j'utilise AVAudioPlayer pour jouer des sons.

avSession = [AVAudioSession sharedInstance]; // init session, important 

// allow other audio to mix, such as iPod 
const UInt32 categoryProp = kAudioSessionCategory_MediaPlayback; 
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(categoryProp), &categoryProp); 

UInt32 category = kAudioSessionCategory_MediaPlayback; 
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(category), &category); 

// Allow our audio to mix with any iPod audio that is playing 
AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(setProperty_YES), &setProperty_YES); 

[avSession setActive:YES error:nil]; 
0

Je ne trouve pas explicitement mentionné dans la documentation, mais je pense le AudioServicesPlaySystemSound() ne tient pas la configuration de votre session audio.

Si vous souhaitez contrôler le mélange de session et d'autres propriétés, vous devez utiliser AVAudioPlayer à la place par exemple:

NSError *err; 
AVAudioSession *session = [AVAudioSession sharedInstance]; 
[session setCategory:AVAudioSessionCategoryPlayback error:&err]; 
[session setActive:YES error:&err]; 

NSString *path = [[NSBundle mainBundle] pathForResource:@"Basso" ofType:@"aiff"];  
AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:&err]; 
[player prepareToPlay]; 
[player play]; 
+0

je joue super courts sons qui ne doivent pas être lus avec AVAudioPlayer. AudioServicesPlaySystemSound ou OpenAL sont les 2 – samvermette

+0

Eh bien, vous ne pouvez pas utiliser AudioServicesPlaySystemSound car le "système" contrôlera les options de mixage de la session, y compris la mise en sourdine, mais je ne vois pas de moyen de contourner cela, même si cela serait très pratique à certains moments. – Crufty

0

je suis en utilisant le code ci-dessous pour résoudre mon problème

AudioSessionInitialize(NULL, NULL, NULL, NULL); UInt32 
sessionCategory = kAudioSessionCategory_MediaPlayback;  
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,sizeof(sessionCategory), 
&sessionCategory); AudioSessionSetActive(YES);