Остановить звук, прежде чем играть другой - PullRequest
0 голосов
/ 12 февраля 2012

Я знаю, что здесь уже задавали этот вопрос, но я не понял ответов. Я делаю деку, и когда вы нажимаете одну из кнопок, чтобы воспроизвести звук, мне бы хотелось, чтобы уже воспроизводившаяся кнопка остановилась. Я знаю, что мне нужно добавить AudioServicesDisposeSystemSoundID(soundID);, но куда мне его добавить? Вот мой код:

- (IBAction)beyond:(id)sender {
    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef;
    soundFileURLRef =  CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"beyond" ,CFSTR ("wav") , NULL);
    UInt32 soundID;
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID);
   }

- (IBAction)Years:(id)sender {
    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef;
    soundFileURLRef =  CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"years" ,CFSTR ("wav") , NULL);
    UInt32 soundID;
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID);
   }

Ответы [ 3 ]

1 голос
/ 12 февраля 2012

Как сказал Бнили.Вам нужно создать переменную экземпляра (или ivar), чтобы несколько методов могли ссылаться на одну и ту же переменную.И, как вы уже знаете, AudioServicesDisposeSystemSoundID() останавливает текущее воспроизведение SystemSoundID.И как только вы объявите ivar, вам не нужно объявлять переменную в каждом методе.Таким образом, логический вывод будет следующим:

@implementation ViewControllerClassNameHere{
    SystemSoundID soundID;
}
- (IBAction)beyond:(id)sender {
    AudioServicesDisposeSystemSoundID(soundID);
    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef;
    soundFileURLRef =  CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"beyond" ,CFSTR ("wav") , NULL);
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID);
}
- (IBAction)Years:(id)sender {
    AudioServicesDisposeSystemSoundID(soundID);
    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef;
    soundFileURLRef =  CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"years" ,CFSTR ("wav") , NULL);
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID);
}

Вы также можете (определенно) захотите CFRelease() скопировать CFURLRef, которые вы скопировали после создания SystemSoundID (так чтоутечка памяти).На самом деле вы можете рассмотреть возможность создания своих CFURLRef иваров, чтобы не копировать их постоянно.Вы также, вероятно, хотите позвонить AudioServicesDisposeSystemSoundID(soundID); в dealloc.

1 голос
/ 10 сентября 2013

Ответ дан ранее: Остановка звука в Xcode

Но я могу повторить свой ответ.

Подводя итог, предложение ОСТАНОВИТЬ звуковой файл:

AudioServicesDisposeSystemSoundID (soundFileObject);

Пояснение (важно понимать):

У меня есть табличное представление с 18 различными звуковыми файлами.Когда пользователь выбирает строку, должен звучать соответствующий файл, а когда выбирается другая строка, он должен ОСТАНОВИТЬ предыдущий звук и воспроизводить другой.

Все это необходимо:

1) Добавьте к своемупроект "AudioToolbox.framework" внутри "Этапы сборки", внутри "Связать двоичные файлы с библиотеками"

2) В заголовочном файле (в моем проекте он называется "GenericTableView.h") добавьте следующие предложения:

#include <AudioToolbox/AudioToolbox.h>

CFURLRef soundFileURLRef;
SystemSoundID soundFileObject;

@property (readwrite) CFURLRef soundFileURLRef;
@property (readonly) SystemSoundID soundFileObject;

3) В внедряемом файле (в моем проекте он называется "GenericTableView.m") добавьте следующие предложения:

@synthesize soundFileURLRef;
@synthesize soundFileObject;

И внутри вашей реализации "Action" или, в моем случае, в:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
//
// That is the question: a way to STOP sound file
//
// -----------------------------------------------------------------------
// Very important to STOP the sound file
AudioServicesDisposeSystemSoundID (soundFileObject);

// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------


// In my project "rowText" is a field that save the name of the 
// corresponding sound (depending on row selected)
// It can be a string, @"Alarm Clock Bell" in example

// Create the URL for the source audio file.
// URLForResource:withExtension: method is new in iOS 4.0.
NSURL *soundURL = [[NSBundle mainBundle] URLForResource:rowText withExtension:@"caf"];

// Store the URL as a CFURLRef instance
self.soundFileURLRef = (CFURLRef) [soundURL retain];

// Create a system sound object representing the sound file.
AudioServicesCreateSystemSoundID (soundFileURLRef,&soundFileObject);

AudioServicesPlaySystemSound (soundFileObject);

[soundURL release];
}

4) Наконец, в том же файле реализации (в моем проекте он называется «GenericTableView.m»):

- (void)dealloc {
[super dealloc];

AudioServicesDisposeSystemSoundID (soundFileObject);
//CFRelease (soundFileURLRef);
}

Я должен прокомментировать «CFRelease (soundFileURLRef)», потому чтоПриложение неожиданно завершает работу, когда пользователь покидает представление таблицы.

Весь этот код пропорционален Apple.В этой ссылке вы можете найти даже пример кода для тестирования непосредственно в симуляторе iPhone.

https://developer.apple.com/library/ios/samplecode/SysSound/Introduction/Intro.html#//apple_ref/doc/uid/DTS40008018-Intro-DontLinkElementID_2

1 голос
/ 12 февраля 2012

Проблема в том, что вы определили soundID как локальную переменную в вашем методе, а не как переменную экземпляра в вашем классе.Когда вы используете переменную экземпляра, вы можете получить к ней доступ позже из любого метода в классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...