Гук перакрываецца з некалькімі прэсамі кнопкі

Пры націску на кнопку, затым націсніце іншую, гукі перакрываюць адзін аднаго. Як я магу выправіць, так што першы гук спыняецца пры націску іншы?

 - (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];


    }
0
Вы можаце зрабіць 1 з наступных дзеянняў: 1. калі націск кнопкі, праверце AVAudioPlayer дагэтуль гуляе. калі так, то вы можаце ігнараваць гэта і не рабіць нічога або 2 вы можаце спыніць яго, то гуляць новы гук.
дададзена аўтар atbebtg, крыніца
дададзена аўтар Josh Caswell, крыніца
дададзена аўтар Josh Caswell, крыніца
Вы павінны фактычна задаць пытанне.
дададзена аўтар wbyoung, крыніца
што Asound?
дададзена аўтар Dor Bashan, крыніца
колькі кнопак у вас ёсць? што вы сапраўды спрабуеце дасягнуць? я не магу бачыць, як вы называеце усё, што метады несапраўднымі з 1 дзеяннем. Я ведаю, што лепшы спосаб справіцца з гукамі ў дэлегатам. Што вашыя мэты?
дададзена аўтар Dor Bashan, крыніца
добра .. паспрабаваць выдаліць, калі (! theAudio) {} і праверыць яго
дададзена аўтар Dor Bashan, крыніца
калі я выдаліць, калі (! theAudio), калі я націскаю некалькі кнопак гукавога перакрыцця
дададзена аўтар alfred, крыніца
маё пытанне заключаецца ў тым, што, калі я націскаю на адной кнопцы, якую ён гуляе гукі, але затым я націскаю іншую, і яны перакрываюцца
дададзена аўтар alfred, крыніца
- (Несапраўднымі) playOnce: (NSString *) Asound;
дададзена аўтар alfred, крыніца
- (IBAction) beatButton50 {[самастойнай playOnce: @ ""] гоначных аўтамабіляў; }
дададзена аўтар alfred, крыніца

6 адказы

Дадаць праверку, каб убачыць, калі гулец ужо гуляе ў пачатку кожнага метаду:

if (theAudio.playing == YES) {
    [theAudio stop];
}

спасылка AVAudioPlayer Класс

0
дададзена

У вашым метадзе playOnce пераменная «шлях» не выкарыстоўваецца - выдаліць, што пазбавіцца ад вашага папераджальнага паведамленні. Ваш playOnce нічога не настроены гуляць, так што я не ўпэўнены, як гэта павінна працаваць - калі вы не тэлефануеце playLooped першым? Акрамя таго, неабходна называць prepareToPlay пасля initWithContentsOfUrl.

 - (void)playOnce:(NSString *)aSound {

  NSString *path = [[NSBundle mainBundle] pathForResource:aSound ofType:@"caf"];
  if (theAudio && [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];
  }

}
0
дададзена
Перш за ўсё дазвольце мне сказаць, Сардэчна запрашаем да перапаўнення стэка. Як гэта прызначаецца, каб працаваць гэта вы спытаеце як адзіны пытанне, калі вы атрымаеце адказ на сваё пытанне, вы паказваеце, што адказ на «праверку» яго з сцяжком. Гэта не фармат, які прызначаецца, каб быць пастаянным падручнік - вы не можаце працягваць дадаваць да першапачатковага пытанні. Калі адзін арыгінальны пытанне не быў дадзены адказ яшчэ, я паспрабую дапамагчы вам у гэтым. Вы можаце разгледзець пытанне пра чытанне кнігі па праграмаванні для Android, так што вы можаце даведацца асновы, калі вы толькі пачынаеце - гэта тое, што я зрабіў.
дададзена аўтар Alan Moore, крыніца
Вы можаце захаваць параметр Asound ў якасці члена класа і параўнайце ваш параметр, каб убачыць, калі яны розныя.
дададзена аўтар Alan Moore, крыніца
Ах, так, я разумею, што вы кажаце. Я думаю, вы павінны праверыць, каб убачыць, калі ў вас ёсць іншы гук і перазагрузіць плэер у гэтым выпадку.
дададзена аўтар Alan Moore, крыніца
Дадаць prepareToPlay, ці спрабавалі вы, што? Вам трэба патэлефанаваць код, які вы маеце на playLoop для налады AVAudioPlayer.
дададзена аўтар Alan Moore, крыніца
што б код выглядаць для гэтага
дададзена аўтар alfred, крыніца
У мяне ёсць код для ўсіх кнопак, але як я бачу, калі ў мяне ёсць іншае прайграванне гуку і перазагрузіць плэер Я пачатковец у праграмаванні, таму я шмат не ведаю
дададзена аўтар alfred, крыніца
я зрабіў, што гукі прыпынку перакрываюцца цяпер гуляе толькі ў той жа гук, калі я спрабую націснуць іншую кнопку з іншым гукам
дададзена аўтар alfred, крыніца
я выдаліў радок playLoop, таму што я на самой справе не трэба, і я выдаліў радок шляху, але да гэтага часу не прайграваецца гук
дададзена аўтар alfred, крыніца

Вы, верагодна, можа зрабіць нешта накшталт наступнага:

    (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];
}
0
дададзена
я хацеў сказаць след. паставіць кропку супыну ў кодзе
дададзена аўтар atbebtg, крыніца
Вы гандлюеце код і пераканайцеся, што [theAudio стоп] завецца?
дададзена аўтар atbebtg, крыніца
я адрэдагаваў мой код. Мяняю stopAudio з [theAudio прыпынку];
дададзена аўтар atbebtg, крыніца
Як гандляваць код павінен я расцепителя гэта пачатковец у праграмаванні ўсё яшчэ спрабуе даведацца
дададзена аўтар alfred, крыніца
яго дзіўна гук яшчэ перакрыцце, калі я націскаю некалькі кнопак
дададзена аўтар alfred, крыніца
ён кажа мне stopAudio не знойдзены
дададзена аўтар alfred, крыніца
ён дае мне памылку, калі я паставіў у гэтым кодзе
дададзена аўтар alfred, крыніца

Вам трэба будзе utizilize значэння 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;

    }   
}

вось шчыра пра гэта. Гэта спыніць гукі пры націску іншы кнопкі.

0
дададзена

Аб'явіць свой AVAudioPlayer ў водосборника ViewController (не Alloc новы, кожны раз, калі вы гуляеце гук). Такім чынам, вы будзеце мець паказальнік можна выкарыстоўваць у метадзе StopAudio.

@interface myViewController : UIViewController  { 
    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];
}

also be sure to read the Apple Docs

0
дададзена
ды выкарыстоўваць метад stopAudio I, паказаны вышэй.
дададзена аўтар ader, крыніца
Затым спыніце AVAudioPlayer перад гульнёй наступнага гуку.
дададзена аўтар ader, крыніца
толькі што адрэдагавалі код, паказаны вышэй. Вы можаце апісаць тое, што вы спрабуеце дасягнуць больш падрабязна?
дададзена аўтар ader, крыніца
я выкарыстаў код у мяне даў і калі я націскаю на кнопку, ён выходзіць з ладу праграму
дададзена аўтар alfred, крыніца
як я буду ствараць AVAudioPlayer ў файле загалоўка я пачатковец у гэтым і шмат не ведаю
дададзена аўтар alfred, крыніца
якой будзе код, каб выправіць гэта
дададзена аўтар alfred, крыніца
для прыпынку AVAudioPlayer Ці я проста выкарыстоўваць метад прыпынку
дададзена аўтар alfred, крыніца
я дадаў гэтыя радкі кодаў і гукі па-ранейшаму перакрыцце
дададзена аўтар alfred, крыніца
я раблю дадатак, якое мае як 20 кнопак і кожны з іх гуляе іншы гук, але гукі накладваюцца адзін на адзін, калі я націскаю на іншых кнопках
дададзена аўтар alfred, крыніца

Код Вы размясцілі будзе гуляць толькі адзін гук, першы гук паслаў да метаду.

Калі вы жадаеце гуляць толькі адзін змяняны гук, пасля таго, як спыняючы гулец, вызваліць theAudio, а затым ўсталяваць новы гук.

0
дададзена
як я выпусціць аўдыё і ўсталяваць новы
дададзена аўтар alfred, крыніца