Как определить входные данные через аудиоразъем?

Я знаю, что некоторые порты наушников для устройств (возможно, все из них: любая ссылка здесь будет хорошей) имеют 3 канала, для стереозвука и микрофона. Поэтому мне было интересно, можно ли обнаружить что-то подобное этой педали на этих устройствах.

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

благодаря

РЕДАКТИРОВАТЬ

Я искал больше об этом, и мне было интересно, будет ли педаль иметь тот же эффект, что и наушники с кнопками. Смертельно легко переопределить их эффекты, я создал простое приложение, которое делает это, и теперь я жду, пока моя педаль попытается. Любые мысли об этом?

ОБНОВИТЬ

Я просто попробовал его в педали, и он не работает. Хотя нам удалось использовать педаль для приостановки музыкального приложения. Однако устройство работало на Cyanogen. Диктофон также ничего не обнаружил при нажатии клавиши. Нужны предложения о том, как их обнаружить :).

ОБНОВИТЬ

Как скоро истечет срок действия, незначительное обновление. Последняя ссылка, предоставленная @ Nick.T, получила некоторую полезную информацию, но я все еще не могу создать образец для обнаружения педали. Поэтому я внес небольшое изменение в заголовок вопроса, и любое руководство в этом направлении было бы очень оценено!

    Неясно, будет ли это работать без наличия у меня реальных аппаратных средств, но … Не подключайте гнездо до упора в гнездо. Затем кончик гнезда подключается к контакту 2, слева аудиовыход этой диаграммы: http://pinoutsguide.com/CellularPhones-PW/samsung_galaxy_headset_pinout.shtml, и кольцо должно подключаться к контакту 3, входящему в микрофон. Если вы нажмете Гнездо полностью включено, штырь заземления на гнезде замыкает микрофонный вход, и вы ничего не обнаружите – изображения на https://en.wikipedia.org/wiki/File:Photo-audiojacks.jpg показывают, как Соединения будут сопряжены.

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

    Все это звучит скорее Хит Робинсон. Вы можете купить встроенный 3-контактный гнездовой разъем и 4-контактный штекер с разъемом для подключения разъема и проложить их вместе, чтобы получить необходимую информацию. Нет электроники; Просто разъемы и биты провода! Или используйте такой кабель, как этот: http://www.ebay.co.uk/itm/1mt-3-5mm-4-Pin-Jack-Male-Plug-4-Pole-Jack-female-Socket-Extension- Lead-Cable- / 251172651017? Pt = UK_Computing_Sound_Vision_Audio_Cables_Adapters & hash = item3a7b0e8009 & _uhb = 1 и острый нож и некоторые липкие ленты.

    Другая проблема возникла бы, если телефон откажется отправлять звук на гнездо, когда гнездо не полностью подключено к розетке – есть дополнительный контакт в сокете, который обнаруживает это механически. Но это сработает, если вы сделаете 3-контактный 4-контактный адаптер.

    Или просто вырежьте 3,5 мм разъем с вашей (блестящей новой) педали экспрессии. Замените его 4-контактным разъемом на одной из этих сломанных телефонных гарнитур, которые вы лежали.

    Согласно вашему последнему обновлению, похоже, что педаль реагирует как кнопка на гарнитуре hands free. Чтобы сказать, играть, приостанавливать и пропускать музыку или пикап / зависание вызова. Если основы API не дают вам возможности справиться с этим (что я сомневаюсь), тогда вы можете перейти к NDK и посмотреть, можно ли его поймать на собственном уровне.

    Я посмотрел и подумал, что это поможет вам найти свой путь:

    • Аудиотехника

    Никогда не знать…

    Здесь есть два потенциальных пути.

    • Можно было бы использовать схему обнаружения присутствия гарнитуры (или, возможно, более конкретно микрофон), и прочитать этот статус через соответствующий API. Это было бы довольно просто (просто нужно выяснить, какое свойство реальной гарнитуры измеряется). Тем не менее, есть хорошая вероятность, что ответ может быть довольно медленным, так как телефон, вероятно, пройдет некоторые изменения конфигурации звука и не захочет этого делать, пока не будет «уверен», что гарнитура подключена или отключена. Кроме того, простейшее обнаружение не-микрофонной гарнитуры может быть связано с механическим механизмом в гнезде, который может быть затруднен электрически с помощью разных моделей.

    • Более сложная идея состояла бы в том, чтобы соединить звук в микрофонный вход и обнаружить это в программном обеспечении. Тем не менее, он должен быть осциллирующим сигналом, поскольку полоса пропускания микрофона обычно не изменяется до постоянного тока. Если вы просто применяете постоянное напряжение, вы получите «щелчок» переходного процесса, когда он изменится, но не иначе. Для подачи сигнала звуковой частоты потребуется источник питания – при тщательном проектировании вы можете украсть достаточную мощность из питания микрофона для запуска небольшого генератора. Но, возможно, проще было бы сделать вывод программного обеспечения звуковым тоном на динамик, а ваш педальный переключатель соединит это обратно в микрофон через небольшой конденсатор.

    Мне наконец удалось прочитать вход педали. @ Emrys57 прав, заменив гнездо 4-контактным разъемом, вызвав вход так же, как и микрофоны с кнопкой крючка. Однако иногда он вызывает увеличение громкости и клавиши уменьшения громкости. Полагаю, это связано с тем, что я заменил 4-контактный разъем ножом и лентой.

    Было довольно просто переопределить onKeyUp. Имейте в виду, что вам также необходимо переопределить onKeyDown, чтобы предотвратить поведение по умолчанию:

    @Override public boolean onKeyDown(int keyCode,KeyEvent event){ int action = event.getAction(); if (keyCode == KeyEvent.KEYCODE_VOLUME_UP || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_HEADSETHOOK) { if (action == KeyEvent.ACTION_UP) { Log.d(TAG, "action_up"); clickStart(null); return true; } else if (action == KeyEvent.ACTION_DOWN) { Log.d(TAG, "action_down"); return true; } else { Log.d(TAG, "action:" + action); return true; } } return false; } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { int action = event.getAction(); Log.d(TAG, "onKeyDown!"); if (keyCode == KeyEvent.KEYCODE_VOLUME_UP || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_HEADSETHOOK) { if (action == KeyEvent.ACTION_UP) { Log.d(TAG, "action_up"); clickStart(null); return true; } else if (action == KeyEvent.ACTION_DOWN) { Log.d(TAG, "action_down"); return false; } else { Log.d(TAG, "action:" + action); return true; } } if (keyCode == KeyEvent.KEYCODE_BACK) { finish(); return true; } Log.d(TAG, "returning false"); return false; }