Подтвердить что ты не робот

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

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

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

Спасибо

EDIT

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

UPDATE

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

ОБНОВЛЕНИЕ

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

4b9b3361

Ответ 1

Не ясно, будет ли это работать без наличия в моем аппарате реального оборудования, но... Не подключайте гнездо до упора в гнездо. Затем кончик гнезда подключается к выходу 2, слева аудиовыход этой диаграммы: http://pinoutsguide.com/CellularPhones-P-W/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-контактным разъемом на одной из этих сломанных телефонных гарнитур, которыми вы располагаетесь.

Ответ 2

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

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

Никогда не знай...

Ответ 3

Здесь есть два возможных пути.

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

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

Ответ 4

Мне наконец удалось прочитать вход педали. @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;
}