2012-02-11 3 views
-4

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

- (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); 
    } 
+0

Ваши имена методов непонятны, не зная, что Пользовательский интерфейс выглядит. Почему ваши методы IBAction называются «за пределами» и «Years»? – bneely

+0

Beyond and Years - это названия звуков, которые воспроизводятся, и кнопки. – user1176046

ответ

1

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

+0

Итак, как я могу это исправить? – user1176046

+1

См. Ответ от NJones. Это довольно простая концепция объектно-ориентированного программирования; Я бы посоветовал вам просмотреть некоторую документацию по объектно-ориентированному программированию. Если вы собираетесь много работать с Objective-C, я лично рекомендую книги по программированию Objective-C и iOS из Big Nerd Ranch. – bneely

1

As bneely said. Вам нужно создать переменную экземпляра (или 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.

0

Он ответил раньше: Stopping sound in Xcode

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

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

AudioServicesDisposeSystemSoundID (soundFileObject); 

Объяснение (Важно понимать):

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

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

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

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; 

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

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

Смежные вопросы