Ardunio 紅外遙控PC音樂播放器_Java後端

                            

          Ardunio 紅外遙控PC音樂播放器
java

 程序說明: windows

本程序經過紅外遙控器,發射信號給接收器,而後由Ardunio 經過 USB 傳給 PC端,實現一個播放器 
 本播放器能夠 播放,暫停,上一首,下一首,靜音,循環,聲音加減 
 相信我,只有JMF才能作到這些功能,其餘的JAVA媒體工具少之又少 
 本程序很Cool,學習的最主要是JAVA怎麼監聽USB,由此能夠開發多種小應用

  環境說明: eclipse

            所需硬件 工具

            1.  Ardunio uno 板一塊 oop

            2.  紅外接收頭一個 學習

            3.  紅外遙控器一個 測試

            4.  麪包板 + 線若干 fetch

            軟件版本:
ui

            Ardunio 1.0.5 
this

            Java 播放 音樂用到的是JMF.版本是2.1.1

            Java 監聽 Ardunio 用到的是RXTX

         本程序所須要的JAVA庫

1. RXTX_lib_32_64.ZIP(JAVA 監聽 USB 所須要的庫) 
    解壓出來以後有RXTX_library_32和RXTX_library_64,一個是32位系統,一個是64位系統,別弄錯了, 把裏面的RXTXcomm.jar放到Eclipse, rxtxSerial.dll就放到 E:\dll\ 而後再Eclipse裏面,找到RXTXcomm.jar,右鍵Propertise - Native Library - 設置rxtxSerial.dll的目錄 
 2. 把jmf.jar mediaplayer.jar sound.jar 都添加到eclipse裏面,這是JMF的庫

            整個項目打包下載地址:

            http://pan.baidu.com/share/link?shareid=522418148&uk=3526727329              

線路圖:

                    此圖是網上找的,實際的圖我沒有拍照,大同小異

Ardunio代碼:  

PS: 請把紅外接收器的 VOUT接到 數字腳11
#include <IRremote.h>     //附件裏面有
int  RECV_PIN = 11;      //定義紅外接收模塊輸出口接arduino數字引腳11

//此處定義遙控器的各個按鍵

#define  btn_poweroff 16753245      
#define  btn_mode  16736925
#define  btn_mute  16769565

#define  btn_pause_start  16720605
#define  btn_previous  16712445
#define  btn_next 16761405

#define  btn_eq  16769055
#define  btn_subtract  16754775
#define  btn_add  16748655

#define  btn_0   16738455
#define  btn_loop  16750695
#define  btn_usd  16756815

#define  btn_1  16724175
#define  btn_2  16718055
#define  btn_3  16743045

#define  btn_4  16716015
#define  btn_5  16726215
#define  btn_6  16734885

#define  btn_7  16728765
#define  btn_8  16730805
#define  btn_9  16732845


IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); //初始化紅外遙控
}


//這裏是簡單的根據遙控器傳播過來的信號,作一個匹配,我已經事先獲取每個鍵的編碼

void loop() {
  if (irrecv.decode(&results)) {

    switch(results.value){
    case btn_poweroff:
      Serial.println("poweroff");
      break;
    case btn_mode:
      Serial.println("mode");
      break;
    case btn_mute:
      Serial.println("mute");
      break;

    case btn_pause_start:
      Serial.println("pause_start");
      break;
    case btn_previous:
      Serial.println("previous");
      break;
    case btn_next:
      Serial.println("next");
      break;

    case btn_eq:
      Serial.println("eq");
      break;
    case btn_subtract:
      Serial.println("substract");
      break;
    case btn_add:
      Serial.println("add");
      break;

    case btn_0:
      Serial.println("0");
      break;
    case btn_loop:
      Serial.println("loop");
      break;
    case btn_usd:
      Serial.println("usd");
      break;

    case btn_1:
      Serial.println("1");
      break;
    case btn_2:
      Serial.println("2");
      break;
    case btn_3:
      Serial.println("3");
      break;

    case btn_4:
      Serial.println("4");
      break;
    case btn_5:
      Serial.println("5");
      break;
    case btn_6:
      Serial.println("6");
      break;

    case btn_7:
      Serial.println("7");
      break;
    case btn_8:
      Serial.println("8");
      break;
    case btn_9:
      Serial.println("9");
      break;

    }

    irrecv.resume(); // 接收下一個值
  }
}




 PC端JAVA程序


            1.  JAVA 監聽 Ardunio 主程序:

package cn.dxy.service;

import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.Enumeration;
import cn.dxy.action.audio.AudioController;
import cn.dxy.action.audio.JMFAudio;
import sun.audio.AudioPlayer;
import sun.audio.AudioStream;

public class ArdunioRemoteMusic implements SerialPortEventListener{
	SerialPort serialPort;
	
    /** 鏈接系統的端口 */
private static final String PORT_NAMES[] = { 
		"/dev/tty.usbserial-A9007UX1", // Mac OS X
		"/dev/ttyUSB0", // Linux
		"COM5", // Windows,此處咱們用到的是windows的com5
};


private BufferedReader input;
private OutputStream output;
private static final int TIME_OUT = 2000;	/**此處爲鏈接超時時間*/
private static final int DATA_RATE = 9600;	/**此處是和PC的USB鏈接通信頻率,默認*/

private static ArdunioRemoteMusic myArdunio = new ArdunioRemoteMusic();

private ArdunioRemoteMusic(){
}
public static ArdunioRemoteMusic getInstance(){
	return myArdunio;
}

/**
 * 
 * 初始化端口鏈接
 * 
 */
public void initialize() {
	   
	CommPortIdentifier portId = null;
	Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();

	//首先,找到已經鏈接好的端口
	while (portEnum.hasMoreElements()) {
		CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();
		for (String portName : PORT_NAMES) {
			if (currPortId.getName().equals(portName)) {
				portId = currPortId;
				System.out.println(PORT_NAMES);
				break;
			}
		}
	}
	
	if (portId == null) {
		System.out.println("Could not find COM port.");
		return;
	}

	try {
		// 打開端口
		serialPort = (SerialPort) portId.open(this.getClass().getName(),
				TIME_OUT);
		// 設置端口參數
		serialPort.setSerialPortParams(DATA_RATE,
				SerialPort.DATABITS_8,
				SerialPort.STOPBITS_1,
				SerialPort.PARITY_NONE);
		// 打開輸入輸出流
		input = new BufferedReader(new InputStreamReader(serialPort.getInputStream()));
		output = serialPort.getOutputStream();
		// 增長事件監聽
		serialPort.addEventListener(this);
		serialPort.notifyOnDataAvailable(true);
	} catch (Exception e) {
		System.err.println(e.toString());
	}
}

/**
 * 當你斷開斷開所觸發的事件
 */
public synchronized void close() {
	if (serialPort != null) {
		serialPort.removeEventListener();
		serialPort.close();
	}
}

/**
 *   當由Ardunio有信息輸入的時候,觸發,進行讀寫
 */
public synchronized void serialEvent(SerialPortEvent oEvent) {
	
	if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
		try {
			String inputLine=input.readLine();
			System.out.println("收到的字符時:"+inputLine);
			AudioController.getInstance().controller(inputLine);	//此處就是音樂播放器模塊
		} catch (Exception e) {
			System.err.println(e.toString());
		}
	}
}

//啓動程序
public static void main(String[] args) throws Exception {
	ArdunioRemoteMusic main = new ArdunioRemoteMusic();
	main.initialize();
	Thread t=new Thread() {
		public void run() {
			//這裏是讓程序有足夠的時間初始化已經運行
			try {Thread.sleep(1000000);} catch (InterruptedException ie) {}
		}
	};
	t.start();
	System.out.println("Ardunio is Started");
}
}


               2. 中間控制類:


package cn.dxy.action.audio;

public class AudioController {
	
	private static JMFAudio audio ;	
	private static AudioController audioController = new AudioController();
	private AudioController(){
		audio = JMFAudio.getInstance();
		audio.initAudio();
	}
	
	public static AudioController getInstance(){
		return audioController;
	}
	
	public void controller(String msg){
		
		//播放,暫停
		if(msg.equals("pause_start")){
			audio.begin();
		}
		
		//下一首歌
		if(msg.equals("next")){
			audio.nextSong();
			audio.play();
		}
		
		//上一首歌
		if(msg.equals("previouse")){
			audio.previouseSong();
			audio.play();
		}
		
		//增長聲音
		if(msg.equals("add")){
			audio.addLevel();
		}
		
		//減小聲音
		if(msg.equals("subtract")){
			audio.subtractLevel();
		}
		
		//靜音
		if(msg.equals("mute")){
			audio.mute();
		}
		
		//單曲循環
		if(msg.equals("loop")){
			audio.loop();
		}
	}
}


            3. 音樂播放器主類,此處用了JMF

package cn.dxy.action.audio;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import javax.media.CannotRealizeException;
import javax.media.ControllerEvent;
import javax.media.ControllerListener;
import javax.media.EndOfMediaEvent;
import javax.media.Manager;
import javax.media.NoPlayerException;
import javax.media.Player;
import javax.media.PrefetchCompleteEvent;
import javax.media.StartEvent;
import javax.media.StopEvent;
import javax.media.Time;

import sun.audio.AudioStream;
/**
 * 音樂播放主類
 * @author sam
 *
 */
public class JMFAudio implements ControllerListener {

	private static JMFAudio jmfAudio = new JMFAudio();
	//這裏是我本地的音樂地址,大家能夠自由替換
	private static String songFile[] = { "e:/wav/login.wav",
			"e:/wav/Adele - Rolling In The Deep.wav",
			"e:/wav/Avril Lavigne - Complicated.wav",
			"e:/wav/Britney Spears - Baby One More Time.wav",
			"e:/wav/Bruno Mars - The Lazy Song.wav",
			"e:/wav/F.I.R - Lydia.wav",
			"e:/wav/Super Junior - Sorry Sorry.wav",
			"e:/wav/Taylor Swift - You Belong With Me.wav",
			"e:/wav/Westlife - My Love.wav",
			"e:/wav/login_last.wav"};

	private File sourceFile;				//音樂地址
	private InputStream inputStream;		// 輸入流
	private static Player audioPlayer;		// 播放器
	private boolean loop = false;			// 是否循環
	private boolean autoUnload;				// 自動卸載
	public boolean playState = true;		// 播放仍是暫停狀態
	private static int curSong = 0; 		// 當前播放歌曲序號
	private static int songLength = 0; 		// 歌曲總數
	private static float curLevel = 0f;		// 當前聲音的大小
	private static boolean muteState = false;	//靜音狀態
	
	private JMFAudio() {
	}

	public static JMFAudio getInstance() {
		System.out.println("init JMFAudio");
		return jmfAudio;
	}

	//初始化
	public void initAudio() {
		songLength = songFile.length;
		load(songFile[0]);
	}

	/**
	 * 經過File 加載歌曲
	 * @param sourceFile
	 */
	public void load(File sourceFile) {// 加載文件
		try {
			if (audioPlayer != null)
				unload();// 若是有正在播放的文件就先卸載播放器
			this.sourceFile = sourceFile;
			audioPlayer = Manager.createRealizedPlayer(sourceFile.toURI()
					.toURL());// 從新創建播放器
			audioPlayer.addControllerListener(this);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}

	/**
	 * 經過地址 加載歌曲
	 * @param fileName
	 */
	public void load(String fileName) {// 加載文件
		try {
			if (audioPlayer != null)
				unload();// 若是有正在播放的文件就先卸載播放器
			sourceFile = new File(fileName);
			audioPlayer = Manager.createRealizedPlayer(sourceFile.toURI()
					.toURL());// 從新創建播放器
			curLevel = audioPlayer.getGainControl().getLevel();
			System.out.println("當前音量是:"+curLevel);
			audioPlayer.addControllerListener(this);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
	
	
	public void load() {// 加載文件
		try {
			if (audioPlayer != null)
				unload();// 若是有正在播放的文件就先卸載播放器
			audioPlayer = Manager.createRealizedPlayer(sourceFile.toURI()
					.toURL());// 從新創建播放器
			audioPlayer.addControllerListener(this);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}

	public void begin(){
		if(playState){
			play();
		}else{
			pause();
		}
		playState= !playState;
	}
	
	public void play() {// 播放文件
		try {
			audioPlayer.prefetch();
			System.out.println("開始播放:"+songFile[curSong]);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}

	public void pause() {// 暫停當前播放
		if (audioPlayer != null)
			audioPlayer.stop();
		System.out.println("暫停播放:"+songFile[curSong]);
	}

	public void stop() {// 中止播放音樂文件
		if (audioPlayer != null) {
			audioPlayer.stop();
			audioPlayer.setMediaTime(new Time(0));//復位JMF播放器對象的開始時間
			System.out.println("中止播放");
		}
	}

	public void unload() {// 卸載播放器
		if (audioPlayer != null) {
			audioPlayer.stop();
			audioPlayer.close();
			audioPlayer = null;
			System.out.println("卸載播放器");
		}
	}

	// 下一首歌
	public void nextSong() {

		if (curSong == songLength - 1) {
			curSong = 0;
		} else {
			curSong = curSong + 1;
		}
		System.out.println("切下一首歌:" + songFile[curSong]);
		load(songFile[curSong]);
	}

	// 上一首歌
	public void previouseSong() {
		if (curSong == 0) {
			curSong = songLength - 1;
		} else {
			curSong = curSong - 1;
		}
		System.out.println("切上一首歌:" + songFile[curSong]);
		load(songFile[curSong]);
	}
	
	//增長聲音
	public void addLevel() {
		if(curLevel < 1){
			curLevel += 0.1f;
		}
		if (audioPlayer != null) {
			audioPlayer.getGainControl().setLevel(curLevel);
			System.out.println("增長音量:"+curLevel);
		}
	}

	
	//減小聲音
	public void subtractLevel() {
		if(curLevel > 0){
			curLevel -= 0.1f;
		}
		if (audioPlayer != null) {
			audioPlayer.getGainControl().setLevel(curLevel);
			System.out.println("減小音量:"+curLevel);
		}
	}
	
	//靜音
	public void mute(){
		if(muteState){
			audioPlayer.getGainControl().setLevel(curLevel);
		}else{
			audioPlayer.getGainControl().setLevel(0);
		}
		muteState = !muteState;
		
	}
	
	//單曲循環
	public void loop(){
		loop = !loop;
		if(loop){
			System.out.println("設置了循環單曲播放");
		}else{
			System.out.println("取消單曲循環播放");
		}
	}
	
	//這個方法很重要,它監聽歌曲的狀態,好比開始,結束,等等
	public void controllerUpdate(ControllerEvent e) {

		if (e instanceof StartEvent) { // 監聽開始播放
		}

		if (e instanceof StopEvent) { // 監聽stop播放
			System.out.println("StopEvent");
		}

		if (e instanceof EndOfMediaEvent) { // 監聽結束播放
			System.out.println("EndOfMediaEvent");
			if (loop){
				audioPlayer.setMediaTime(new Time(0));//復位JMF播放器對象的開始時間
				audioPlayer.start();
			}else{
				nextSong();
				play();
			}
			return;
		}

		if (e instanceof PrefetchCompleteEvent){
			System.out.println("PrefetchCompleteEvent");
			audioPlayer.start();
		}
	
	}
	
	//初始化,本地測試用
//	public void init() {
//		initAudio();
//		loop = false;
//		play();
//	}
//
//	public static void main(String[] args) throws IOException,
//			NoPlayerException, CannotRealizeException {
//		new JMFAudio().init();
//	}
}

PS:轉載時請註明轉載地址   http://my.oschina.net/samtribiani/blog/145409

相關文章
相關標籤/搜索