Аудио на iPhone

Быстрое (но очень грязное) решение

Это быстрое, но оно не позаботится о ctrl+z или cmd+z и даст вам ложное срабатывание при нажатии shift, ctrl или клавиша tab:

$('#my-form').on('change keyup paste', ':input', function(e) {
    // The form has been changed. Your code here.
});

Проверьте это с помощью этой скрипки.


Быстрое (менее грязное) решение

Это предотвратит ложные срабатывания клавиш shift, ctrl или tab, но не будет обрабатывать ctrl+z или cmd+z:

$('#my-form').on('change keyup paste', ':input', function(e) {

  var keycode = e.which;

  if (e.type === 'paste' || e.type === 'change' || (
      (keycode === 46 || keycode === 8) || // delete & backspace
      (keycode > 47 && keycode < 58) || // number keys
      keycode == 32 || keycode == 13 || // spacebar & return key(s) (if you want to allow carriage returns)
      (keycode > 64 && keycode < 91) || // letter keys
      (keycode > 95 && keycode < 112) || // numpad keys
      (keycode > 185 && keycode < 193) || // ;=,-./` (in order)
      (keycode > 218 && keycode < 223))) { // [\]' (in order))

    // The form has been changed. Your code here.

  }

});

Проверьте это с помощью этой скрипки.


Полное (менее быстрое) решение

Если вы хотите обработать все случаи, вы должны использовать:

// init the form when the document is ready or when the form is populated after an ajax call
$(document).ready(function() {
  $('#my-form').find(':input').each(function(index, value) {
    $(this).data('val', $(this).val());
  });
})

$('#my-form').on('change paste', ':input', function(e) {
  $(this).data('val', $(this).val());
  // The form has been changed. Your code here.
});

$('#my-form').on('keyup', ':input', function(e) {
  if ($(this).val() != $(this).data('val')) {
    $(this).data('val', $(this).val());
    // The form has been changed. Your code here. 
  }
});

Test это с этой скрипкой.

10
задан Matthew 16 June 2009 в 17:17
поделиться

3 ответа

Я пошел по этому пути в 2009 году, попробовал Audio Toolkit, Audio Queue Services, openAL и, наконец, остановился на RemoteIO AudioUnit.

Audio Toolbox отлично подходит для основных звуковых эффектов срабатывания, но он не мог изменять частоту или зацикливать сэмплы.

Audio Queue Services может зацикливать сэмплы, но единственный способ, которым я смог отрегулировать частоту воспроизведения сэмпла, - это перечитать данные из файла - очень болезненно. Кроме того, фреймворк чрезвычайно громоздок - я бы использовал его только в том случае, если я пытался передать что-то из Интернета.

OpenAL был находкой - он был запущен и работал с ним менее чем за час, после того как я получил в руки Образец приложения для iPhone "CrashLanding" от Apple больше не доступен. Я обнаружил, что OpenAL идеально подходит для игр или даже для музыкального инструмента - сэмплы можно было предварительно загружать, регулировать частоту было легко, а зацикливание не было проблемой. Решающим фактором для меня было то, что запуск и остановка зацикленного семпла почти каждый раз приводили к неприятному «хлопку». Кроме того, встроенный трехмерный позиционный аудиомикшер, на мой взгляд, был слишком интенсивным для ЦП.

Если ваш инструмент не использует зацикленные семплы, я бы предложил сначала попробовать маршрут OpenAL - кривая обучения намного менее пугающая. Попробуйте найти «SoundEngine.h», «CrashLanding» или «TouchFighter» или перейдите по следующей ссылке:

http://benbritten.com/blog/2008/11/06/openal-sound-on- the-iphone /

Поскольку для меня требовались зацикленные семплы, я наконец остановился на AudioUnits (который, на iPhone называется «RemoteIO», если вы хотите выполнять ввод или вывод). Это было чрезвычайно сложно реализовать - очень похоже на Audio Queue Services, поскольку ядро ​​вашей реализации будет внутри «обратного вызова буфера», вызываемого несколько раз в секунду для заполнения буфера исходящего звука необработанными значениями SInt16.

В конце концов, мой инструмент прекрасно работает с многоголосной полифонией, зацикленными семплами, без щелчка и с минимальной задержкой.

К сожалению, RemoteIO плохо документирован. Майкл Тайсон был одним из первых, кто написал о RemoteIO подробно, и его сообщения (и комментарии) были мне очень полезны:

http://michael.tyson.id.au/2008/11/ 04 / using-remoteio-audio-unit /

Удачи!

Отредактировано спустя годы: I '

19
ответ дан 3 December 2019 в 19:35
поделиться

Попробуйте создать аудиоустройство. Я делаю что-то подобное, у меня AU сработало. Изначально я использовал аудио-очередь, так как она была проще (более высокий уровень?) И синхронный, однако ему не хватало отзывчивости, поэтому я сбросил его для Аудиоустройство.

1
ответ дан 3 December 2019 в 19:35
поделиться

Это немного похоже на то, как будто вы создаете метод синтеза волновой таблицы для воспроизведения файлов MIDI. Возможно, вы сможете найти MIDI-синтезатор для iPhone, который сможете использовать, а затем использовать свои аудиосэмплы для создания набора волновых таблиц. В любое время, когда вы захотите воспроизвести тоны, вы просто отправите событие MIDI в MIDI-синтезатор iPhone с загруженным набором волновой таблицы.

0
ответ дан 3 December 2019 в 19:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: