2012-11-27 54 views
11

我知道某些设备的耳机端口(也许它们都是这里的任何参考都很好)有3个通道,用于立体声和麦克风。所以我想知道是否有可能在这些设备上检测到类似this pedal的东西。如何通过音频插孔检测输入数据?

如果可能的话,使用audio recorder就足够了?我正在研究应用程序的可能性,如果可能的话,这听起来很有希望。

感谢

编辑

我正在寻找更多关于这一点,我在想,如果踏板将不得不与这些按钮耳机同样的效果。 It's deadly easy to override their effects,我创建了一个简单的应用程序,现在我正在等待我的踏板尝试。有关它的任何想法?

UPDATE

我刚刚试了一下踏板,它不工作。虽然我们设法使用踏板暂停音乐应用程序。虽然该设备运行Cyanogen。录音机也没有检测到按键上的任何内容。需要关于如何检测它的建议:)。

UPDATE

AS赏金即将到期,一个小更新。 @ Nick.T提供的最后一个链接获得了一些有用的信息,但我仍然无法创建样本来检测踏板。因此,我对标题问题做了一些小改动,对此方向的任何指导将非常感谢!

+0

有趣的问题(我没有线索,但想知道我自己)。我可以看到一个车库乐队风格的应用程序,允许手动输入,如转台或其他电子输入(乐器)。 –

+0

考虑到[square reader](https://squareup.com/reader)基于使用音频端口,我想象你所要求的也是可能的。 –

+0

该踏板似乎内部没有其他电位器。该连接器是一个3针插孔(使用图像上的变焦),因此它可能将插头的一端连接到插孔的接地插针,因此另一端和插座的滑块连接到另外两个插孔引脚。三星插孔在http://pinoutsguide.com/CellularPhones-P-W/samsung_galaxy_headset_pinout.shtml。所以锅连接到左右音频输出,而不是麦克风。没有希望。 – emrys57

回答

3

目前尚不清楚这是否会而无需工作我的手中有实际的硬件,但是......不要将插孔完全插入插座。插孔的尖端应然后连接到引脚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 和一把锋利的刀和一些stickytape。会来

另一个问题,如果手机拒绝发送音频插孔时,插孔没有插充分家 - 有插座的额外接触,其检测机械。但是如果你制作了3引脚到4引脚的适配器,它将会工作。

或者,只是削减了3.5mm插孔把你的(崭新的)表情踏板。将其替换为4针连接器,然后将其置于您周围躺着的电话耳机之一。

1

这里有两种可能的途径。

  • 一种方法是使用耳机(或者更具体的说是麦克风)存在检测电路,并通过适当的API读取该状态。这将是相当简单的(只需要弄清真正的耳机的属性)。但是,响应可能相当缓慢,因为手机可能会经历一些音频配置更改,并且在“确定”耳机已连接或断开连接之前不会想要这样做。最简单的非麦克风头戴式耳机检测也可以通过插孔中的机械机构进行,这可能难以跨模型进行电驱动。

  • 一个更复杂的想法是将一些声音耦合到麦克风输入,并用软件检测。但是,它必须是振荡信号,因为麦克风带宽通常不会降到DC。如果你只是施加一个稳定的电压,当它发生变化时,你会得到一个“咔嗒”的瞬态,但不是这样。注入音频信号需要一个电源 - 通过仔细的设计,您可以从麦克风偏置电源窃取足够的功率来运行小型振荡器。但也许更简单的是让软件在扬声器上输出音频音调,然后通过一个小电容器将踏板开关连接到麦克风上。

+0

为了更加准确,我需要这个仅在星系选项卡上工作。我可以使用录音机类检测麦克风的使用情况。我也不需要任何非常精确的东西。一个简单的挖掘或不挖掘工程。问题是我无法在这些踏板上拿到我的手。 – caiocpricci2

+0

当你设置它时,我会很感激你的任何建议,如何找出真正耳机的哪些属性被测量。我不知道如何在没有踏板的情况下进行测试。 – caiocpricci2

+0

你可能更好的发布在electronics.stackexchange.com上。另请参阅此讨论http://electronics.stackexchange.com/questions/20731/is-there-any-way-to-feed-a-signal-line-in-into-a-mobile-phone。用按钮开关构建一个简单的电路很容易,您可以将其用作概念验证。 – Simon

2

根据您上次更新,它看起来像踏板反应就像免提耳机上的按钮。也就是说,可以播放,暂停和跳过音乐或接听/挂断电话。 如果API的基础知识没有给你一种方法来获得它(我怀疑),那么你可以下降到NDK,看看它是否可以被本机级别捕获。

我看着它,并认为这可能会帮助你找到你的方式:

永远不知道...

+0

恰恰相反,它不会对我的重写键检测做出反应。我已经完全忘记了NDK。今晚我会看看它!感谢您的建议! – caiocpricci2

1

我终于设法读取踏板输入。 @ 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; 
} 
相关问题