#iphone #ios4 #audio
#iPhone #ios4 #память #Аудио
Вопрос:
Когда я нажимаю кнопку, затем нажимаю другую, звуки накладываются друг на друга. Как я могу это исправить, чтобы первый звук прекращался при нажатии другого?
- (void)playOnce:(NSString *)aSound {
NSString *path = [[NSBundle mainBundle] pathForResource:aSound ofType:@"caf"];
AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
[theAudio setDelegate: self];
[theAudio setNumberOfLoops:0];
[theAudio setVolume:1.0];
[theAudio play];
}
- (void)playLooped:(NSString *)aSound {
NSString *path = [[NSBundle mainBundle] pathForResource:aSound ofType:@"caf"];
AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
[theAudio setDelegate: self];
// loop indefinitely
[theAudio setNumberOfLoops:-1];
[theAudio setVolume:1.0];
[theAudio play];
[theAudio release];
}
Комментарии:
1. Вам действительно нужно задать вопрос.
2. мой вопрос в том, что когда я нажимаю на одну кнопку, она воспроизводит звуки, но затем я нажимаю другую, и они перекрываются
3. вы можете выполнить одно из следующих действий: 1. после нажатия кнопки проверьте, продолжает ли воспроизведение AVAudioPlayer. если да, вы можете проигнорировать это и ничего не делать или 2, вы можете остановить это, а затем воспроизвести новый звук.
4. — (недействительный)playOnce:(NSString *)aSound;
5. — (IBAction) beatButton50 { [self playOnce:@»racecars»]; }
Ответ №1:
Объявите свой AVAudioPlayer в заголовке ViewController (не выделяйте новый при каждом воспроизведении звука). Таким образом, у вас будет указатель, который вы сможете использовать в методе StopAudio.
@interface myViewController : UIViewController <AVAudioPlayerDelegate> {
AVAudioPlayer *theAudio;
}
@property (nonatomic, retain) AVAudioPlayer *theAudio;
@end
@implementation myViewController
@synthesize theAudio;
- (void)dealloc {
[theAudio release];
}
@end
- (void)playOnce:(NSString *)aSound {
NSString *path = [[NSBundle mainBundle] pathForResource:aSound ofType:@"caf"];
if(!theAudio){
theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL: [NSURL fileURLWithPath:path] error:NULL];
}
[theAudio setDelegate: self];
[theAudio setNumberOfLoops:0];
[theAudio setVolume:1.0];
[theAudio play];
}
- (void)playLooped:(NSString *)aSound {
NSString *path = [[NSBundle mainBundle] pathForResource:aSound ofType:@"caf"];
if(!theAudio){
theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL: [NSURL fileURLWithPath:path] error:NULL];
}
[theAudio setDelegate: self];
// loop indefinitely
[theAudio setNumberOfLoops:-1];
[theAudio setVolume:1.0];
[theAudio play];
}
- (void)stopAudio {
[theAudio stop];
[theAudio setCurrentTime:0];
}
также обязательно ознакомьтесь с документами Apple
Комментарии:
1. как мне создать AVAudioPlayer в файле заголовка я новичок в этом и многого не знаю
2. я добавил эти строки кодов, и звуки все еще перекрываются
3. просто отредактировал код выше. можете ли вы описать, чего вы пытаетесь достичь более подробно?
4. я создаю приложение, в котором примерно 20 кнопок, и каждая из них воспроизводит свой звук, но звуки перекрываются, когда я нажимаю на другие кнопки
5. Затем остановите AVAudioPlayer перед воспроизведением следующего звука.
Ответ №2:
Опубликованный вами код будет воспроизводить только один звук, первый звук, отправленный в метод.
Если вы хотите воспроизводить только один изменяемый звук, после остановки проигрывателя отключите аудиосистему, а затем установите новый звук.
Комментарии:
1. как мне отключить звук и установить новый
Ответ №3:
Добавьте проверку, чтобы увидеть, играет ли проигрыватель уже в начале каждого метода:
if (theAudio.playing == YES) {
[theAudio stop];
}
Ответ №4:
В вашем методе playOnce переменная ‘path’ не используется — удалите ее, чтобы избавиться от вашего предупреждающего сообщения. Ваш playOnce ничего не настраивает для воспроизведения, поэтому я не уверен, как это должно работать — если вы сначала не вызовете playLooped? Вы также должны вызывать prepareToPlay после initWithContentsOfURL.
- (void)playOnce:(NSString *)aSound {
NSString *path = [[NSBundle mainBundle] pathForResource:aSound ofType:@"caf"];
if (theAudio amp;amp; [theAudio isPlaying]) {
[theAudio stop]
} else {
theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL: [NSURL fileURLWithPath: path] error: NULL];
[theAudio prepareToPlay];
[theAudio setDelegate: self];
[theAudio setNumberOfLoops: 1];
[theAudio setVolume: 1.0];
[theAudio play];
}
}
Комментарии:
1. я удалил строку playLoop, потому что она мне действительно не была нужна, и я удалил строку path, но звук по-прежнему не воспроизводится
2. Добавить prepareToPlay, вы пробовали это? Вам действительно нужно вызвать код, который у вас есть в playLoop, чтобы настроить AVAudioPlayer.
3. я сделал это, звуки перестают накладываться, теперь воспроизводится тот же звук, только когда я пытаюсь нажать другую кнопку с другим звуком
4. Ах, верно, я понимаю, о чем ты говоришь. Я думаю, вам нужно проверить, есть ли у вас другой звук, и перезагрузить проигрыватель в этом случае.
5. у меня есть код для всех кнопок, но как мне увидеть, воспроизводится ли у меня другой звук, и перезагрузить проигрыватель Я новичок в программировании, поэтому я мало что знаю
Ответ №5:
Вам нужно будет использовать значение BOOL, чтобы заставить это работать должным образом.
в вашем файле .m ПЕРЕД @implementation поместите это:
static BOOL soundIsPlaying = NO;
Тогда ваше IBAction должно выглядеть примерно так:
- (IBAction)play {
if (soundIsPlaying == YES) {
[theAudio release];
soundIsPlaying = NO;
}
else if (soundIsPlaying == NO) {
NSString *path = [[NSBundle mainBundle] pathForResource:@"SOUNDFILENAME" ofType:@"wav"];
theAudio=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
theAudio.delegate = self;
theAudio.volume = 1.0;
theAudio.numberOfLoops = 0;
[theAudio play];
soundIsPlaying = YES;
}
}
честно говоря, это все. При нажатии другой кнопки звуки прекращаются.
Ответ №6:
Вероятно, вы можете сделать что-то вроде следующего:
(void) playLooped: (NSString * ) aSound {
NSString * path = [[NSBundle mainBundle] pathForResource: aSound ofType: @"caf"];
//stop audio player from playing so the sound don't overlap
if([theAudio isPlaying])
{
[theAudio stop]; //try this instead of stopAudio
}
if (!theAudio) {
theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL: [NSURL fileURLWithPath: path] error: NULL];
}
[theAudio setDelegate: self];
// loop indefinitely
[theAudio setNumberOfLoops: -1];
[theAudio setVolume: 1.0];
[theAudio play];
}
Комментарии:
1. это говорит мне, что stopAudio не найден
2. странно, что звук все еще перекрывается, когда я нажимаю несколько кнопок
3. вы поменяли код и убедились, что вызывается [Остановка прослушивания]?
4. как мне изменить код, должен ли я его выпустить, я новичок в программировании, все еще пытаюсь учиться