1 /*
2 * Controller.cpp - Media Player for the Haiku Operating System
3 *
4 * Copyright (C) 2006 Marcus Overhagen <marcus@overhagen.de>
5 * Copyright (C) 2007 Stephan Aßmus <superstippi@gmx.de>
6 * Copyright (C) 2008-2009 Fredrik Modéen <[FirstName]@[LastName].se> (MIT ok)
7 *
8 * Released under the terms of the MIT license.
9 */
10
11
12 #include "ControllerView.h"
13
14 #include <Autolock.h>
15 #include <Message.h>
16 #include <stdio.h>
17 #include <string.h>
18
19 #include "Controller.h"
20 #include "Playlist.h"
21 #include "PlaylistObserver.h"
22
23
ControllerView(BRect frame,Controller * controller,Playlist * playlist)24 ControllerView::ControllerView(BRect frame, Controller* controller,
25 Playlist* playlist)
26 :
27 TransportControlGroup(frame, true, true, false),
28 fController(controller),
29 fPlaylist(playlist),
30 fPlaylistObserver(new PlaylistObserver(this))
31 {
32 fPlaylist->AddListener(fPlaylistObserver);
33 }
34
35
~ControllerView()36 ControllerView::~ControllerView()
37 {
38 fPlaylist->RemoveListener(fPlaylistObserver);
39 delete fPlaylistObserver;
40 }
41
42
43 void
AttachedToWindow()44 ControllerView::AttachedToWindow()
45 {
46 TransportControlGroup::AttachedToWindow();
47 }
48
49
50 void
Draw(BRect updateRect)51 ControllerView::Draw(BRect updateRect)
52 {
53 TransportControlGroup::Draw(updateRect);
54 }
55
56
57 void
MessageReceived(BMessage * message)58 ControllerView::MessageReceived(BMessage* message)
59 {
60 switch (message->what) {
61 case MSG_PLAYLIST_ITEM_ADDED:
62 case MSG_PLAYLIST_ITEM_REMOVED:
63 case MSG_PLAYLIST_ITEMS_SORTED:
64 case MSG_PLAYLIST_CURRENT_ITEM_CHANGED:
65 _CheckSkippable();
66 break;
67
68 case MSG_PLAYLIST_IMPORT_FAILED:
69 break;
70
71 default:
72 TransportControlGroup::MessageReceived(message);
73 break;
74 }
75 }
76
77
78 // #pragma mark -
79
80
81 void
TogglePlaying()82 ControllerView::TogglePlaying()
83 {
84 BAutolock _(fPlaylist);
85 if (fPlaylist->CurrentItemIndex() == fPlaylist->CountItems() - 1
86 && Position() == 1.0) {
87 // Reached end of playlist and end of last item
88 // -> start again from the first item.
89 fPlaylist->SetCurrentItemIndex(0, true);
90 } else
91 fController->TogglePlaying();
92 }
93
94
95 void
Stop()96 ControllerView::Stop()
97 {
98 fController->Stop();
99 }
100
101
102 void
Rewind()103 ControllerView::Rewind()
104 {
105 // TODO: make it so this function is called repeatedly
106 //printf("ControllerView::Rewind()\n");
107 }
108
109
110 void
Forward()111 ControllerView::Forward()
112 {
113 // TODO: make it so this function is called repeatedly
114 //printf("ControllerView::Forward()\n");
115 }
116
117
118 void
SkipBackward()119 ControllerView::SkipBackward()
120 {
121 BAutolock _(fPlaylist);
122 int32 index = fPlaylist->CurrentItemIndex() - 1;
123 if (index < 0)
124 index = 0;
125 fPlaylist->SetCurrentItemIndex(index, true);
126 }
127
128
129 void
SkipForward()130 ControllerView::SkipForward()
131 {
132 BAutolock _(fPlaylist);
133 int32 index = fPlaylist->CurrentItemIndex() + 1;
134 if (index >= fPlaylist->CountItems())
135 index = fPlaylist->CountItems() - 1;
136 fPlaylist->SetCurrentItemIndex(index, true);
137 }
138
139
140 void
VolumeChanged(float value)141 ControllerView::VolumeChanged(float value)
142 {
143 fController->SetVolume(value);
144 }
145
146
147 void
ToggleMute()148 ControllerView::ToggleMute()
149 {
150 fController->ToggleMute();
151 }
152
153
154 void
PositionChanged(float value)155 ControllerView::PositionChanged(float value)
156 {
157 // 0.0 ... 1.0
158 fController->SetPosition(value);
159 }
160
161
162 // #pragma mark -
163
164
165 void
_CheckSkippable()166 ControllerView::_CheckSkippable()
167 {
168 BAutolock _(fPlaylist);
169
170 bool canSkipNext, canSkipPrevious;
171 fPlaylist->GetSkipInfo(&canSkipPrevious, &canSkipNext);
172 SetSkippable(canSkipPrevious, canSkipNext);
173 }
174