GO语言练习:第二个工程--模拟音乐播放器

1、代码

2、编译及运行



1、目录结构

  1.1)

 1 $ tree
 2 .
 3 ├── mplayer.go
 4 └── src
 5     ├── mlib
 6     │   ├── manager.go
 7     │   └── manager_test.go
 8     └── mp
 9         ├── mp3.go
10         └── play.go

  1.2)mlib库的代码

    1.2.1)manager.go代码

 1 package library
 2
 3 import "errors"
 4
 5 type MusicEntry struct {
 6     Id        string
 7     Name    string
 8     Artist    string
 9     Genre    string
10     Source    string
11     Type    string
12 }
13
14 type MusicManager struct {
15     musics []MusicEntry
16 }
17
18 func NewMusicManager() * MusicManager {
19     return &MusicManager {make( []MusicEntry, 0)}
20 }
21
22 func (m * MusicManager) Len() int {
23     return len(m.musics);
24 }
25
26 func (m* MusicManager ) Get(index int) (music * MusicEntry, err error) {
27     if index < 0 || index >= len(m.musics) {
28         return nil, errors.New("Index out of range.")
29     }
30
31     return &m.musics[index], nil
32 }
33
34 func (m * MusicManager) Find (name string) * MusicEntry {
35     if len(m.musics) == 0 {
36         return nil
37     }
38
39     for _,m := range m.musics {
40         if m.Name == name {
41             return &m
42         }
43     }
44     return nil
45 }
46
47 func (m * MusicManager) Add (music * MusicEntry) {
48     m.musics = append(m.musics, * music)
49 }
50
51 func (m * MusicManager) Remove (index int) * MusicEntry {
52     if index < 0 || index >= len(m.musics) {
53         return nil
54     }
55     removedMusic := &m.musics[index]
56
57     if index < len(m.musics) - 1 {
58         m.musics = append(m.musics[:index - 1], m.musics[index + 1:]...)
59     }else if index == 0 {
60         m.musics = make([]MusicEntry, 0)
61     } else {
62         m.musics = m.musics[:index - 1]
63     }
64
65     return removedMusic
66 }
67
68 func (m * MusicManager) RemoveByName (name string) * MusicEntry {
69     var removedMusic * MusicEntry = nil
70     var iPos int = -1
71     for i := 0; i < m.Len(); i++ {
72         if m.musics[i].Name == name {
73             iPos = i
74             break
75         }
76     }
77
78     if iPos < 0 {
79         return nil
80     }
81
82     removedMusic = m.Remove(iPos)
83
84     return removedMusic
85 }

  1.2.2)manager.go的测试代码manager_test.go

 1 package library
 2
 3 import (
 4     "testing"
 5 )
 6
 7 func TestOps(t * testing.T) {
 8     mm := NewMusicManager()
 9     if mm == nil {
10         t.Error("NewMusicManager faild.");
11     }
12     if mm.Len() != 0 {
13         t.Error("NewMusicManager faild, not empty")
14     }
15     m0 := &MusicEntry { "1", "My Heart Will Go On", "Celion Dion", "Pop", "http://qbox.me/24501234", "MP3" }
16     mm.Add(m0)
17
18     if mm.Len() != 1 {
19         t.Error("MusicManager.Add faild.")
20     }
21
22     m := mm.Find(m0.Name)
23     if m == nil {
24         t.Error("MusicManager.Find faild")
25     }
26
27     if    m.Id != m0.Id ||
28         m.Name != m0.Name ||
29         m.Artist != m0.Artist ||
30         m.Genre != m0.Genre ||
31         m.Source != m0.Source ||
32         m.Type != m0.Type {
33             t.Error("MusicManager.Find() faild. Found item mismatch.")
34     }
35
36     m, err := mm.Get(0)
37     if m == nil {
38         t.Error("MusicManager.Get() faild.", err)
39     }
40
41     m = mm.Remove(0)
42     if m == nil || mm.Len() != 0 {
43         t.Error("MusicManager.Remove() faild.", err)
44     }
45 }

  1.3)mp库代码

    1.3.1)src/mp/mp3.go代码

 1 package mp
 2
 3 import (
 4     "fmt"
 5     "time"
 6 )
 7
 8 type MP3Player struct {
 9     stat int
10     progress int
11 }
12
13 type WAVPlayer struct {
14     stat int
15     progress int
16 }
17
18 func (p * MP3Player) Play (source string) {
19     fmt.Println("Playing MP3 music", source)
20
21     p.progress = 0
22
23     for p.progress < 100 {
24         time.Sleep(100 * time.Millisecond)
25         fmt.Print(".")
26         p.progress += 10
27     }
28     fmt.Println("\nFinished playing", source)
29 }
30
31 func (p * WAVPlayer) Play (source string) {
32     fmt.Println("Playing WAV music", source)
33
34     p.progress = 0
35
36     for p.progress < 100 {
37         time.Sleep(100 * time.Millisecond)
38         fmt.Print(".")
39         p.progress += 10
40     }
41     fmt.Println("\nFinished playing", source)
42 }

    1.3.2)src/mp/play.go代码

 1 package mp
 2
 3 import "fmt"
 4
 5 type Player interface {
 6     Play(source string)
 7 }
 8
 9 func Play(source, mtype string) {
10     var p Player
11
12     switch mtype {
13     case "MP3" :
14         p = &MP3Player{}
15     case "WAV" :
16         p = &WAVPlayer{}
17         default :
18         fmt.Println("Unsupported music type", mtype)
19         return
20     }
21     p.Play(source)
22 }

  1.4)main package模块代码mplayer.go

 1 package main
 2
 3 import (
 4     "bufio"
 5     "fmt"
 6     "os"
 7     "strconv"
 8     "strings"
 9
10     "mlib"
11     "mp"
12 )
13
14 var lib * library.MusicManager
15 var id int = 1
16 var ctrl, signal chan int
17
18 func handleLibCommands(tokens []string) {
19     switch tokens[1] {
20     case "list" :
21         for i := 0; i < lib.Len(); i++ {
22             e, _ := lib.Get(i)
23             fmt.Println(i + 1, ":", e.Name, e.Artist, e.Source, e.Type)
24         }
25     case "add" :
26         if len(tokens) == 7 {
27             id++
28             lib.Add(&library.MusicEntry { strconv.Itoa(id), tokens[2], tokens[3], tokens[4], tokens[5], tokens[6] })
29         } else {
30             fmt.Println("USAGE : lib add <name><artist><genre><source><type> (7 argv)")
31         }
32     case "remove" :
33         if len(tokens) == 3 {
34             lib.RemoveByName(tokens[2])
35         } else {
36             fmt.Println("USAGE: lib remove <name>")
37         }
38         default :
39         fmt.Println("Unrecogized lib command: ", tokens[1])
40     }
41 }
42
43 func handlePlayCommands(tokens []string) {
44     if len(tokens) != 2 {
45         fmt.Println("USAGE : play <name>")
46         return
47     }
48
49     e := lib.Find(tokens[1])
50     if e == nil {
51         fmt.Println("The music", tokens[1], "does not exist.")
52         return
53     }
54
55     mp.Play(e.Source, e.Type)
56 }
57
58 func main() {
59     fmt.Println(`
60     Enter following commands to control the player:
61     lib list --View the existing music lib
62     lib add <name><artist><genre><source><type> -- Add a music to the music lib
63     lib remove <name> --Remove the specified music from the lib
64     play <name> -- Play the specified music
65     `)
66     lib = library.NewMusicManager()
67
68     r := bufio.NewReader(os.Stdin)
69
70     for i := 0; i <= 100; i++ {
71         fmt.Print("Enter command-> ")
72         rawLine, _, _ := r.ReadLine()
73
74         line := string(rawLine)
75         if line == "q" || line == "e" {
76             break
77         }
78         tokens := strings.Split(line, " ")
79
80         if tokens[0] == "lib" {
81             handleLibCommands(tokens)
82         } else if tokens[0] == "play" {
83             handlePlayCommands(tokens)
84         } else {
85             fmt.Println("Unrecognized command :", tokens[0])
86         }
87     }
88 }

  2)编译及运行

    2.1)设置环境GOPATH

$ export GOPATH="/home/normal/musicplayer"

    2.2)编译

1 $ go build

    2.3)查看编译后的目录结构

 1 .
 2 ├── mplayer.go
 3 ├── musicplayer
 4 └── src
 5     ├── mlib
 6     │   ├── manager.go
 7     │   └── manager_test.go
 8     └── mp
 9         ├── mp3.go
10         └── play.go

    2.4)运行

$ ./musicplayer 

    Enter following commands to control the player:
    lib list --View the existing music lib
    lib add <name><artist><genre><source><type> -- Add a music to the music lib
    lib remove <name> --Remove the specified music from the lib
    play <name> -- Play the specified music

Enter command-> lib add a b c d e
Enter command-> lib list
1 : a b d e
Enter command-> play a
Unsupported music type e
Enter command-> lib remove a
Enter command-> lib add a b c d e MP3
USAGE : lib add <name><artist><genre><source><type> (7 argv)
Enter command-> lib add a b c d MP3
Enter command-> lib list
1 : a b d MP3
Enter command-> play a
Playing MP3 music d
..........
Finished playing d
Enter command-> q

注:代码来源《Go语言编程》第三章,代码结构与原书有差别

时间: 2024-09-30 14:45:58

GO语言练习:第二个工程--模拟音乐播放器的相关文章

第二十九节(java-开发简单音乐播放器 )

package com.tanzhou.jmf; import java.applet.*; import java.awt.*; import java.awt.event.*; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import javax.swing.*; // JFrame java的GUI程序的基本思路是以JFrame为基础,它是屏幕上window的对象,能够最大

手把手教你做音乐播放器(八)桌面小工具(上)

第8节 桌面小工具 桌面小工具是可以放置在主界面的.快速控制应用的小助手.例如我们的音乐小工具,它可以帮助用户在桌面上就完成音乐的暂停.播放.切换等操作,而不需要启动应用本身. 在安卓系统中,我们也常常叫它App widget. 实现一个App widget要经过以下几个步骤, 创建一个App widget类,让它继承自AppWidgetProvider,例如AnddleMusicAppWidget类: 放在res\layout目录下,为App widget的界面定义一个布局,例如anddle_

仿酷狗音乐播放器开发日志二十四 选项设置窗体的实现(附328行xml布局源码)

转载请说明原出处,谢谢~~ 花了两天时间把仿酷狗的选项设置窗体做出来了,当然了只是做了外观.现在开学了,写代码的时间减少,所以整个仿酷狗的工程开发速度减慢了.今天把仿酷狗的选项设置窗体的布局代码分享出来,给学习duilib布局的朋友做个demo.现在编写的仿酷狗选项设置窗体和原酷狗的窗体不细看几乎看不出差别,控件的布局位置和原酷狗最多只有几个像素的位置差别. 先来看一下原酷狗的选项设置窗体的其中一个页面: 如果还不太会布局的朋友可以先看我前些日子写的关于duilib布局的博客<duilib各种布

【程序开发小记】VB.NET音乐播放器

写在前面的话: 为了营造一个很好的交流学习的环境,也是为了迎合学校毕业设计的需求,开通了博客园.在下学期伊始,会每星期更新毕业设计的进度.博客业已开通,为了交流学习,要只是更新毕业设计的进度显得有些做作.博主并不是好看书时写些小评的主儿,遂不知有和内容好献于此,只得将之前课程中或是实习时开发的程序在此做个简述. 因这些项目也是博主心血,也是怕某些学弟学妹直接搬用引发事端,不便将源码原封不动摆在这里,在此只做简要说明. 若有意愿交流学习,可以在评论或是私信留下联系方式. 话不多说,接下来直奔主题.

[MFC] MFC音乐播放器 傻瓜级教程 网络 搜索歌曲 下载

>目录< >----------------------< 1.建立工程  1.建立一个MFC工程,命名为Tao_Music 2.选择为基本对话框 3.包含Windows Sockts 4.使用静态链接库 [方便一会直接生成的exe文件单独可以发布] 2. 搭建界面  1. 拖入控件: 2. 控件拖入并摆好 3. 控件属性设置: 3. 写代码实现功能  1.变量绑定: 2.加入图片资源 3.新建mp3类: 4.修改Tao_MusicDlg.h 5.修改Tao_Music.cpp 6

AIDL在音乐播放器中的应用

一.AIDL简介 由于每个应用程序都运行在自己的进程空间,并且可以从应用程序UI运行另一个服务进程,而且经常会在不同的进程间传递对象.在Android平台,一个进程通常不能访问另一个进程的内存空间,所以要想访问的话,需要将对象分解成操作系统可以理解的基本单元,并且有序的通过进程边界.通过代码来实现这个数据传输过程是冗长,但是Android为开发者提供了AIDL工具来处理这项工作. AIDL (Android Interface Definition Language)是一种IDL语言,用于生成可

STM32实现Airplay音乐播放器

AirPlay是苹果公司推出的一套无线音乐解决方案,我们手里的iPhone.iPad甚至是Apple Watch等设备还有电脑上的iTunes都支持AirPlay,但是支持AirPlay功能的音响设备都是比较贵的,荷包扁扁的我自然是感觉买那么贵的音响实在是不合算.前两天突发奇想,如果STM32可以支持AirPlay的功能,那么不就可以让我享受一把无线音乐的自由自在了吗?于是马上登陆github搜了一下,发现还真有解决方案不过基本上所有的方案都是在linux或者windows上运行的,精挑细选之后

html网页音乐播放器自带播放列表

基于网页的音乐播放器demo  http://pan.baidu.com/s/1dDgm7HR 自己diy了一个手机端在线音乐播放器演示地址http://shanxi2014.com/zhuandizhi/dom.php 全面支持手机端浏览器. 主要修改引用路径(不要修改文件相对存放地址) 第二就是正则拼接参数了 <script src="/city/js/libs/jquery-1.10.2.min.js"></script> <script src=&

iOS 简单音乐播放器 界面搭建

如图搭建一个音乐播放器界面,具备以下几个简单功能: 1,界面协调,整洁. 2,点击播放,控制进度条. 3.三收藏歌曲,点击收藏,心形收藏标志颜色加深. 4,左右按钮,切换歌曲图片和标题. 5,点击中间图片,隐藏所有按钮,仅显示蓝色背景. 设计的整体思路: 1.在搭建界面的时候,为了整洁和方便后续的功能的添加,需要将整个的界面划分为几个部分: ①:最上面的一行包括:一个返回按钮.一个歌曲名称.一个收藏按钮: ②:第二行:一个slider控件.两侧是当前的歌曲播放进度和歌曲的总时长--两个lable