极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11987|回复: 1

Ardunio 红外遥控PC音乐播放器_Java后端

[复制链接]
发表于 2013-7-18 17:48:15 | 显示全部楼层 |阅读模式
本帖最后由 samtribiani 于 2013-7-18 17:53 编辑

                                                                         Ardunio 红外遥控PC音乐播放器
程序说明:
本程序通过红外遥控器,发射信号给接收器,然后由Ardunio 通过 USB 传给 PC端,实现一个播放器
本播放器可以 播放,暂停,上一首,下一首,静音,循环,声音加减
相信我,只有JMF才能做到这些功能,其他的JAVA媒体工具少之又少
本程序很Cool,学习的最主要是JAVA怎么监听USB,由此可以开发多种小应用
  环境说明:
            所需硬件
            1.  Ardunio uno 板一块
            2.  红外接收头一个
            3.  红外遥控器一个
            4.  面包板 + 线若干
            软件版本:
            Ardunio 1.0.5
            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

  1. int  RECV_PIN = 11;      //定义红外接收模块输出口接arduino数字引脚11

  2. //此处定义遥控器的各个按键

  3. #define  btn_poweroff 16753245      
  4. #define  btn_mode  16736925
  5. #define  btn_mute  16769565

  6. #define  btn_pause_start  16720605
  7. #define  btn_previous  16712445
  8. #define  btn_next 16761405

  9. #define  btn_eq  16769055
  10. #define  btn_subtract  16754775
  11. #define  btn_add  16748655

  12. #define  btn_0   16738455
  13. #define  btn_loop  16750695
  14. #define  btn_usd  16756815

  15. #define  btn_1  16724175
  16. #define  btn_2  16718055
  17. #define  btn_3  16743045

  18. #define  btn_4  16716015
  19. #define  btn_5  16726215
  20. #define  btn_6  16734885

  21. #define  btn_7  16728765
  22. #define  btn_8  16730805
  23. #define  btn_9  16732845


  24. IRrecv irrecv(RECV_PIN);
  25. decode_results results;

  26. void setup()
  27. {
  28.   Serial.begin(9600);
  29.   irrecv.enableIRIn(); //初始化红外遥控
  30. }


  31. //这里是简单的根据遥控器传播过来的信号,做一个匹配,我已经事先获取每一个键的编码

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

  34.     switch(results.value){
  35.     case btn_poweroff:
  36.       Serial.println("poweroff");
  37.       break;
  38.     case btn_mode:
  39.       Serial.println("mode");
  40.       break;
  41.     case btn_mute:
  42.       Serial.println("mute");
  43.       break;

  44.     case btn_pause_start:
  45.       Serial.println("pause_start");
  46.       break;
  47.     case btn_previous:
  48.       Serial.println("previous");
  49.       break;
  50.     case btn_next:
  51.       Serial.println("next");
  52.       break;

  53.     case btn_eq:
  54.       Serial.println("eq");
  55.       break;
  56.     case btn_subtract:
  57.       Serial.println("substract");
  58.       break;
  59.     case btn_add:
  60.       Serial.println("add");
  61.       break;

  62.     case btn_0:
  63.       Serial.println("0");
  64.       break;
  65.     case btn_loop:
  66.       Serial.println("loop");
  67.       break;
  68.     case btn_usd:
  69.       Serial.println("usd");
  70.       break;

  71.     case btn_1:
  72.       Serial.println("1");
  73.       break;
  74.     case btn_2:
  75.       Serial.println("2");
  76.       break;
  77.     case btn_3:
  78.       Serial.println("3");
  79.       break;

  80.     case btn_4:
  81.       Serial.println("4");
  82.       break;
  83.     case btn_5:
  84.       Serial.println("5");
  85.       break;
  86.     case btn_6:
  87.       Serial.println("6");
  88.       break;

  89.     case btn_7:
  90.       Serial.println("7");
  91.       break;
  92.     case btn_8:
  93.       Serial.println("8");
  94.       break;
  95.     case btn_9:
  96.       Serial.println("9");
  97.       break;

  98.     }

  99.     irrecv.resume(); // 接收下一个值
  100.   }
  101. }
复制代码



PC端JAVA程序
            1.  JAVA 监听 Ardunio 主程序:

[pre lang="java" line="1"]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");
}
}[/code]


2. 中间控制类:
[pre lang="java" line="1"]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();
                }
        }
}[/code]


3. 音乐播放器主类,此处用了JMF
[pre lang="java" line="1"]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();
//        }
}[/code]


回复

使用道具 举报

发表于 2015-8-21 10:06:08 | 显示全部楼层
厉害!没学过java,表示看不懂
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-16 17:48 , Processed in 0.037358 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表