2011-08-22 4 views
1

나는 주변에서 놀고있는 것이 내가하는 일반적인 프로그래밍의 범위를 벗어나므로 나는 더 많은 시간을 낭비하기 전에 내가 물을 것이라고 생각했다.오디오 입력 프로그래밍

그래서 기본적으로 컴퓨터 켜기/끄기 스위치에서 발견되는 버튼이 있으며 전자 제품에 대한 내 지식이 너무 많아서 표준 오디오 케이블에 연결되어 있습니다 (물론 내 컴퓨터 오디오에 연결되어 있습니다.) 잭). Audacity를 통해 나는 버튼을 클릭 할 때 오디오 웨이브 폼이 생성되고 픽업된다는 것을 발견했다.

이것은 모두 매우 기본적인 것입니다. 필자는 절망적으로 마이크로 컨트롤러로 사운드 카드를 사용하기로 결정했습니다.

어쨌든 나는 당신이 모두 내가 이것으로 어디로 가고 있는지 알 것이다. 명령 프롬프트 (테스트 용) 및 특정 작업을 수행하기 위해 입력에서 오는 정보를 모니터하고 처리하는 백그라운드 프로세스 (예 : 컴퓨터 잠금 또는 Firefox 열기 등)에서 실행되는 작은 응용 프로그램을 프로그래밍하는 방법은 무엇입니까? ..)?

저는 컴퓨팅 학위의 일환으로 자바와 함께 일합니다. (우리는 여전히 매우 기본적인 것들을 배우고 있습니다. 그러므로 질문입니다.) 그리고 일상적으로 PHP로 일하기 때문에 새로운 것을 배우는 것도 괜찮습니다. 언어가 있다면.

답변

1

나는이 것을 스스로 알아 냈습니다. 기본적으로 입력 라인을 듣는 것만 큼 쉬우면서 오디오의 진폭이 일정량이되면 메소드를 실행합니다. 테스트를 통해 버튼을 눌렀을 때 진폭이 음수로 측정되고 버튼을 놓을 때 양의 진폭이 등록된다는 사실도 발견했습니다. 즉, 개별 이벤트에 대한 코드를 작성할 수 있음을 의미하며, 스마트 한 경우 인터벌 타이머를 사용하여 버튼을 누르고있는 동안 이벤트를 추가 할 수도 있습니다.

import javax.sound.sampled.AudioFormat; 
import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.DataLine; 
import javax.sound.sampled.LineUnavailableException; 
import javax.sound.sampled.TargetDataLine; 
import javax.sound.sampled.Mixer.Info; 


public class AudioInputButton { 
    private int line; 
    private AudioFormat format; 
    private Info[] lines; 
    private TargetDataLine inputLine; 
    private DataLine.Info inInfo; 
    private int bufferSize; 

    public AudioInputButton(int line){ 
    this.line = line; 
    this.setup(); 
    } 

    public AudioInputButton(){ 
    this.line = 2; 
    this.setup(); 
    } 

    private void setup(){ 
    format = new AudioFormat(8000, 8, 1, true, true); 
    lines = AudioSystem.getMixerInfo();  
    inInfo = new DataLine.Info(TargetDataLine.class, format); 
    bufferSize = (int) format.getSampleRate() * format.getFrameSize(); 
    } 

    public void printLineInfo(){ 
    for (int i = 0; i < lines.length; i++){ 
     System.out.println(i+": "+lines[i].getName()+"\n"+lines[i].getDescription()); 
    } 
    } 

    public void startListening(){ 
    try{ 
     inputLine = (TargetDataLine)AudioSystem.getMixer(lines[line]).getLine(inInfo); 
     inputLine.open(format, bufferSize); 
     inputLine.start(); 

     byte[] buffer = new byte[bufferSize]; 

     System.out.println("Listening on line " +line+", " + lines[line].getName() + "..."); 

     while(true){ 
     inputLine.read(buffer,0,buffer.length); 
     int sample = listen(buffer); 
     if(sample > 0){ 
      onClick(); 
     } 
     } 
    }catch (LineUnavailableException e){ 
     System.out.println("Line " + line + " is unavailable."); 
     e.printStackTrace(); 
     System.exit(1); 
    } 
    } 

    public int listen(byte[] eightBitByteArray) 
    { 
    int index = 0; 
    int ret = 0; 
    boolean down = false; 
    boolean up = false; 
    for (int audioByte = 0; audioByte < eightBitByteArray.length;) 
    { 
     int low = (int) eightBitByteArray[audioByte]; 
     audioByte++; 
     int high = (int) eightBitByteArray[audioByte]; 
     audioByte++; 
     int sample = (high << 8) + (low & 0x00ff); 
     if(sample < -1100){ 
     if(!down){ 
      onDown(); 
      ret = sample; 
      down = true; 
     } 
     }else if(sample > 1100){ 
     if(!up){ 

      onUp(); 
      ret = sample; 
      down = false; 
      up = true; 
     } 
     } 
     index++; 
    } 
    return ret; 
    } 

    private void onClick(){ 
    System.out.println("Click!"); 
    } 

    private void onDown(){ 
    System.out.println("Down!"); 
    } 

    private void onUp(){ 
    System.out.println("Up"); 
    } 
} 

AudioInputButtonTester.java

public class AudioInputButtonTester { 
    public static void main (String [] args){ 
    AudioInputButton myButton = new AudioInputButton(2); 
    myButton.startListening(); 
    } 
} 

에게

AudioInputButton.java :

어쨌든 여기에 코드입니다 (불행하게도 나는 그것을 언급 할 시간이 없었어요) 다양한 버튼 상태를 이벤트로 바꿔서 테스터 클래스에 코드를 작성하십시오. 그러나 오전 2시 30 분에 오디오 코드를 사용하여 AudioInputButton을 확장하는 새로운 버튼 클래스를 만드는 로직을 분리하려는 경우가 있습니다.

0

이 작업은 COM port을 사용하여 표준화되거나 단순화 될 수 있다고 생각합니다.

체크 아웃이 예 http://www.java2s.com/Code/Java/Development-Class/COM-Port.htm http://java.sun.com/developer/Books/javaprogramming/cookbook/11.pdf

당신은 (잭에 오디오를-사용하여 작업을 수행하려는 경우 마이크 입력 포트), 사운드 진폭의 입력 레벨을 확인하고 강도 수준에 따라 작업을 수행해야합니다. 이를 위해 자바에서 멀티 스레딩 및 사운드 녹음에 대한 아이디어를 얻으십시오.

+0

내 참을성으로 나는 좋은 오래된 자바를 통해 그것을 할 수있는 길을 찾았습니다. 나는 이것을 재미있게 실제로 시도하고있다. –

관련 문제