Skip to content
This repository was archived by the owner on Jun 10, 2021. It is now read-only.

Commit 0e4712d

Browse files
authored
Merge pull request #13 from goulinkh/feat-play-speed
Closes #5
2 parents 7bd0e13 + eabaa60 commit 0e4712d

File tree

9 files changed

+77
-30
lines changed

9 files changed

+77
-30
lines changed

.github/FUNDING.yml

Lines changed: 0 additions & 3 deletions
This file was deleted.

audio-player/player.go

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,10 @@ type AudioPlayer struct {
2626
}
2727

2828
var (
29-
MainCtrl *beep.Ctrl
30-
Volume *effects.Volume
29+
MainCtrl *beep.Ctrl
30+
Volume *effects.Volume
31+
resampler *beep.Resampler
32+
3133
Streamer beep.StreamSeekCloser
3234
Format beep.Format
3335
)
@@ -92,9 +94,11 @@ func PlaySound(e *itunesapi.Episode) error {
9294
sr := Format.SampleRate * 2
9395
speaker.Init(sr, sr.N(time.Millisecond*500))
9496

95-
Volume.Streamer = beep.Resample(4, Format.SampleRate, sr, Streamer)
96-
MainCtrl = &beep.Ctrl{Streamer: Volume}
97-
speaker.Play(MainCtrl)
97+
streamer := beep.Resample(4, Format.SampleRate, sr, Streamer)
98+
MainCtrl = &beep.Ctrl{Streamer: streamer}
99+
resampler = beep.ResampleRatio(4, 1, MainCtrl)
100+
Volume = &effects.Volume{Streamer: resampler, Base: 2}
101+
speaker.Play(Volume)
98102
e.DurationInMilliseconds = int(float32(Streamer.Len())/float32(Format.SampleRate)) * 1000
99103
return nil
100104
}
@@ -105,6 +109,26 @@ func PauseSong(state bool) {
105109
speaker.Unlock()
106110
}
107111

112+
func IncreaseSpeed() {
113+
speed := resampler.Ratio() * 1.100000e+000
114+
if speed >= 1.800000e+000 {
115+
return
116+
}
117+
speaker.Lock()
118+
resampler.SetRatio(speed)
119+
speaker.Unlock()
120+
}
121+
122+
func DecreaseSpeed() {
123+
speed := resampler.Ratio() * 0.900000e+000
124+
if speed <= 1.000000e+000 {
125+
return
126+
}
127+
speaker.Lock()
128+
resampler.SetRatio(speed)
129+
speaker.Unlock()
130+
}
131+
108132
func Seek(pos int) error {
109133
if MainCtrl != nil {
110134
speaker.Lock()
@@ -116,6 +140,10 @@ func Seek(pos int) error {
116140
}
117141

118142
func SetVolume(percent int) {
143+
if percent > 100 {
144+
return
145+
}
146+
119147
if percent == 0 {
120148
Volume.Silent = true
121149
} else {

resources/img/demo.gif

-55 KB
Loading

ui/Podcasts.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,15 +63,16 @@ func (p *PodcastsUI) initGridWidget() error {
6363
ui.NewRow(1.0,
6464
ui.NewCol(1.0/2, p.listWidget),
6565
ui.NewCol(1.0/2,
66-
ui.NewRow(5.0/7, p.detailsWidget),
67-
ui.NewRow(2.0/7, audioPlayerWidget.MainUI()))))
66+
ui.NewRow(6.0/8, p.detailsWidget),
67+
ui.NewRow(2.0/8, audioPlayerWidget.MainUI()))))
6868
return nil
6969
}
7070
func (p *PodcastsUI) initListWidget() {
7171
p.listWidget = widgets.NewList()
7272
p.listWidget.Title = "Podcasts List"
7373
p.listWidget.TextStyle.Fg = FgColor
74-
p.listWidget.SelectedRowStyle.Fg = AccentColor
74+
p.listWidget.SelectedRowStyle.Fg = ui.ColorBlack
75+
p.listWidget.SelectedRowStyle.Bg = AccentColor
7576
p.listWidget.BorderStyle.Fg = AccentColor
7677
p.listWidget.Rows = make([]string, len(p.Podcasts))
7778
for i, podcast := range p.Podcasts {

ui/audio_player.go

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ type AudioPlayerWidget struct {
1616
audioPositionWidget *widgets.Gauge
1717
playerStatusWidget *widgets.Paragraph
1818
grid *ui.Grid
19+
playSpeed float32
1920
}
2021

2122
func (ap *AudioPlayerWidget) InitComponents() {
@@ -28,6 +29,7 @@ func (ap *AudioPlayerWidget) InitComponents() {
2829
func (ap *AudioPlayerWidget) MainUI() *ui.Grid {
2930
return ap.grid
3031
}
32+
3133
func (ap *AudioPlayerWidget) HandleEvent(e *ui.Event) (Command, error) {
3234
switch e.ID {
3335
case "p", "<Space>":
@@ -48,6 +50,15 @@ func (ap *AudioPlayerWidget) HandleEvent(e *ui.Event) (Command, error) {
4850
audioplayer.Seek(position)
4951
}
5052
}
53+
case "]":
54+
if audioplayer.MainCtrl != nil && ap.nowPlaying != nil {
55+
audioplayer.IncreaseSpeed()
56+
}
57+
case "[":
58+
if audioplayer.MainCtrl != nil && ap.nowPlaying != nil {
59+
audioplayer.DecreaseSpeed()
60+
}
61+
5162
}
5263
return Nothing, nil
5364
}
@@ -116,7 +127,9 @@ func (ap *AudioPlayerWidget) initGrid() {
116127
ap.grid = ui.NewGrid()
117128
ap.grid.Border = false
118129
ap.grid.Set(
119-
ui.NewRow(1.0/2, ap.playerStatusWidget),
120-
ui.NewRow(1.0/2, ap.audioPositionWidget),
130+
ui.NewRow(1.0,
131+
ui.NewRow(1.0/2, ap.playerStatusWidget),
132+
ui.NewRow(1.0/2, ap.audioPositionWidget),
133+
),
121134
)
122135
}

ui/episodes.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ func (e *EpisodesUI) initGridWidget() error {
5757
ui.NewRow(1.0,
5858
ui.NewCol(1.0/2, e.listWidget),
5959
ui.NewCol(1.0/2,
60-
ui.NewRow(5.0/7, e.detailsWidget),
61-
ui.NewRow(2.0/7, audioPlayerWidget.MainUI()))))
60+
ui.NewRow(6.0/8, e.detailsWidget),
61+
ui.NewRow(2.0/8, audioPlayerWidget.MainUI()))))
6262
return nil
6363
}
6464

@@ -67,7 +67,8 @@ func (e *EpisodesUI) initListWidget() {
6767
e.listWidget.Title = "Episodes"
6868
e.listWidget.SelectedRowStyle.Modifier = ui.ModifierClear
6969
e.listWidget.TextStyle.Fg = FgColor
70-
e.listWidget.SelectedRowStyle.Fg = AccentColor
70+
e.listWidget.SelectedRowStyle.Fg = ui.ColorBlack
71+
e.listWidget.SelectedRowStyle.Bg = AccentColor
7172
e.listWidget.BorderStyle.Fg = AccentColor
7273
e.listWidget.Rows = make([]string, len(e.Episodes))
7374
for i, episode := range e.Episodes {

ui/genres.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ func (g *GenresUI) newGenresListWidget() error {
4949
g.listWidget = widgets.NewList()
5050
g.listWidget.Title = "Select a Genre"
5151
g.listWidget.TextStyle = ui.NewStyle(FgColor)
52-
g.listWidget.SelectedRowStyle = ui.NewStyle(AccentColor)
52+
g.listWidget.SelectedRowStyle.Fg = ui.ColorBlack
53+
g.listWidget.SelectedRowStyle.Bg = AccentColor
5354
g.listWidget.BorderStyle.Fg = AccentColor
5455
if g.Genres == nil {
5556
return errors.New("Missing Genres array")
@@ -67,9 +68,15 @@ func (g *GenresUI) newGridWidget() error {
6768
g.gridWidget = ui.NewGrid()
6869
termWidth, termHeight := ui.TerminalDimensions()
6970
g.gridWidget.SetRect(0, 0, termWidth, termHeight-1)
71+
placeholder := ui.NewBlock()
72+
placeholder.BorderBottom = false
73+
placeholder.BorderLeft = false
74+
placeholder.BorderStyle.Fg = AccentColor
7075
g.gridWidget.Set(
7176
ui.NewRow(1.0,
7277
ui.NewCol(1.0/2, g.listWidget),
73-
ui.NewCol(1.0/2, audioPlayerWidget.MainUI())))
78+
ui.NewCol(1.0/2,
79+
ui.NewRow(6.0/8, placeholder),
80+
ui.NewRow(2.0/8, audioPlayerWidget.MainUI()))))
7481
return nil
7582
}

ui/page.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ func newHelpBarWidget() *widgets.Paragraph {
9090
"[Esc ](fg:black)[Back](fg:black,bg:green) " +
9191
"[Right ](fg:black)[+10s](fg:black,bg:green) " +
9292
"[Left ](fg:black)[-10s](fg:black,bg:green) " +
93+
"[ d ](fg:black)[Speeddown](fg:black,bg:green)" +
94+
"[ u ](fg:black)[Speedup](fg:black,bg:green)" +
9395
"[ q ](fg:black)[Exit](fg:black,bg:green)"
9496
helpBarWidget.Border = false
9597
helpBarWidget.WrapText = true

ui/sub_genres.go

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ func (g *SubGenresUI) newGenresListWidget() error {
5050
g.listWidget = widgets.NewList()
5151
g.listWidget.Title = "Select a Sub Genre"
5252
g.listWidget.TextStyle = ui.NewStyle(FgColor)
53-
g.listWidget.SelectedRowStyle = ui.NewStyle(AccentColor)
53+
g.listWidget.SelectedRowStyle.Fg = ui.ColorBlack
54+
g.listWidget.SelectedRowStyle.Bg = AccentColor
5455
g.listWidget.BorderStyle.Fg = AccentColor
5556
if g.Genres == nil {
5657
return errors.New("Missing Sub Genres array")
@@ -68,21 +69,18 @@ func (g *SubGenresUI) newGridWidget() error {
6869
g.gridWidget = ui.NewGrid()
6970
termWidth, termHeight := ui.TerminalDimensions()
7071
g.gridWidget.SetRect(0, 0, termWidth, termHeight-1)
72+
placeholder := ui.NewBlock()
73+
placeholder.BorderBottom = false
74+
placeholder.BorderLeft = false
75+
placeholder.BorderStyle.Fg = AccentColor
7176
g.gridWidget.Set(
7277
ui.NewRow(1.0,
7378
ui.NewCol(1.0/2, g.listWidget),
74-
ui.NewCol(1.0/2, audioPlayerWidget.MainUI())))
79+
ui.NewCol(1.0/2,
80+
ui.NewRow(6.0/8, placeholder),
81+
ui.NewRow(2.0/8, audioPlayerWidget.MainUI()))))
7582
return nil
7683
}
7784
func (g *SubGenresUI) refreshComponents() {
78-
g.listWidget.Rows = make([]string, len(g.Genres))
79-
for i, genre := range g.Genres {
80-
g.listWidget.Rows[i] = genre.Text
81-
}
82-
termWidth, termHeight := ui.TerminalDimensions()
83-
g.gridWidget.SetRect(0, 0, termWidth, termHeight-1)
84-
g.gridWidget.Set(
85-
ui.NewRow(1.0,
86-
ui.NewCol(1.0/2, g.listWidget),
87-
ui.NewCol(1.0/2, audioPlayerWidget.MainUI())))
85+
g.newGenresListWidget()
8886
}

0 commit comments

Comments
 (0)