ограничить или расширить количество воспроизводимых сэмплов - PullRequest
1 голос
/ 12 марта 2012

Я пробую код в этом примере и в основном я хочу ограничить количество воспроизводимых семплов.

Прямо сейчас, как только вы нажмете кнопку воспроизведения, приложение воспроизводит звук с установленной частотой, но оно не останавливается, пока вы не нажмете «Стоп». Я хотел бы проигрывать звук только секунду.

Есть идеи, как это сделать? Я уже пытался изменить inNumberFrames на 44100, но все, что делает, это делает мой тон нестабильным.

// Generate the samples
for (UInt32 frame = 0; frame < inNumberFrames; frame++) 
{
    buffer[frame] = sin(theta) * amplitude;

    theta += theta_increment;
    if (theta > 2.0 * M_PI)
    {
        theta -= 2.0 * M_PI;
    }
}

EDIT

Курт Ревис говорит, что CoreAudio неоднократно вызывает вашу функцию RenderTone (). Я не думал об этом, но думаю, это имеет смысл. Это действительно приводит меня к другому вопросу: что произойдет, если я захочу отправить как 4-минутную песню в буфер? (44100 * 60 * 4 образца)

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

1 Ответ

1 голос
/ 12 марта 2012

Две возможности.

  1. Высокий уровень: Когда вы начинаете играть, создайте NSTimer, который вызывает метод для вызова -stop через одну секунду.Или используйте -[NSObject performSelector:withObject:afterDelay:].

  2. Низкий уровень: в RenderTone() отслеживайте, сколько сэмплов уже сыграно.При вызовах RenderTone() сохраняйте это значение в ivar в контроллере представления, точно так же, как это происходит с theta.В цикле генерации выборки, если счетчик выборок> = 44100, установите buffer[frame] в 0.

Фундаментальная вещь, которую нужно понять: CoreAudio повторно вызывает вашу функцию RenderTone()всякий раз, когда ему нужно больше аудио данных для воспроизведения.Он запрашивает у вас определенный объем данных (inSampleCount), и вам нужно предоставить именно столько, ни больше, ни меньше.Если вы хотите, чтобы он воспроизводил тишину, вам необходимо заполнить буфер нулями.

...