Звукът на AVAudioPlayer на iPhone спира да се повтаря неочаквано: Как да отстранявате грешки?

Внедрявам звуков ефект, който се възпроизвежда, докато потребител плъзга UISlider.

В предишен въпрос използвах AudioServicesPlaySystemSound()но този тип звук не може да бъде спрян. Имам нужда звукът да спира, когато потребителят не плъзга активно плъзгача, но не го е пуснал.

Сега създавам звук с помощта на обект AVAudioPlayer. Инициализирам го в моя View Controller така:

@interface AudioLatencyViewController : UIViewController <AVAudioPlayerDelegate> {
AVAudioPlayer *player1;
}

@implementation AudioLatencyViewController
@property (nonatomic, retain) AVAudioPlayer *player1;
@synthesize player1;

-(void)viewDidLoad {

[super viewDidLoad];

// the sound file is 1 second long
NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"tone1" ofType:@"caf"];
NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:soundFilePath];

AVAudioPlayer *newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil];

[fileURL release];
self.player1 = newPlayer;;
[newPlayer release];

[self.player1 prepareToPlay];
[self.player1 setDelegate:self];
}

Имам два метода за контрол на звука. Първият възпроизвежда звук при всяко движение на плъзгача. Той е свързан със събитието Value Changed на UISlider в Interface Builder.

-(IBAction)sliderChanged:(id)sender;
{
    // only play if previous sound is done. helps with stuttering
    if (![self.player1 isPlaying]) {
        [self.player1 play];
    }
}

Вторият метод спира звука, когато потребителят пусне плъзгача. Свързано е със събитието Touch Up Inside на UISlider.

-(IBAction)haltSound;
{
    [self.player1 stop];
}

Това работи, когато бутонът на плъзгача се премести и след това се освободи бързо, но ако задържите бутона за повече от две или три секунди, звукът се повтаря (добре), след което прекъсва (лошо). От този момент нататък звукът няма да се възпроизвежда отново (супер лошо).

Опитах се да настроя звука да се повтаря с помощта на:

[self.player1 setNumberOfLoops:30];

... но това води до замразяване на приложението (плюс заключване на симулатора).

Какво мога да направя, за да отстраня този проблем?


person willc2    schedule 30.05.2009    source източник


Отговори (1)


Когато потребител държи UISlider, Value Changed се извиква МНОГО МНОГО пъти (всеки път, когато потребителят се движи съвсем малко). Вместо това бих използвал Touch Down.

Може все пак да опитате да използвате цикъла за този маршрут...

Харесва ми обаче идеята за възпроизвеждане на звук, докато потребителят движи плъзгача. Кажете ми как се получава.

[email protected]

person Community    schedule 12.07.2009