2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <mm_player.h>
20 #include <WidgetDB/WidgetDBMgr.h>
21 #include <Commons/WrtAccess/WrtAccess.h>
22 #include <MMPlayer/EventOnStateChange.h>
27 namespace WrtDeviceApis {
40 void Manager::openFile(const EventOpenPtr& event)
42 EventRequestReceiver<EventOpen>::PostRequest(event);
45 void Manager::play(const EventPlayPtr& event)
47 EventRequestReceiver<EventPlay>::PostRequest(event);
50 void Manager::pause(const EventPausePtr& event)
52 EventRequestReceiver<EventPause>::PostRequest(event);
55 void Manager::resume(const EventResumePtr& event)
57 EventRequestReceiver<EventResume>::PostRequest(event);
60 void Manager::stop(const EventStopPtr& event)
62 EventRequestReceiver<EventStop>::PostRequest(event);
65 void Manager::setWindow(const EventSetWindowPtr& event)
67 EventRequestReceiver<EventSetWindow>::PostRequest(event);
70 void Manager::isPlaying(const EventIsPlayingPtr& event)
72 EventRequestReceiver<EventIsPlaying>::PostRequest(event);
75 void Manager::getVolume(const EventGetVolumePtr& event)
77 EventRequestReceiver<EventGetVolume>::PostRequest(event);
80 void Manager::OnRequestReceived(const EventOpenPtr& event)
84 string fullName = event->getFilename();
85 MMPlayerPtr player = DPL::DynamicPointerCast<MMPlayer>(event->getPlayer());
87 LogError("MMPlayerPtr cast error");
88 event->setExceptionCode(Commons::ExceptionCodes::PlatformException);
93 if (MM_PLAYER_STATE_NULL != player->getState()) {
94 err = mm_player_unrealize(player->getHandler());
95 if (MM_ERROR_NONE != err) {
96 LogError("Can't unrealize player. Error code: " << std::hex << err);
97 event->setExceptionCode(Commons::ExceptionCodes::PlatformException);
102 if (!fullName.length()) {
103 event->setExceptionCode(
104 Commons::ExceptionCodes::InvalidArgumentException);
108 //Check if current installation path should be added
109 if ((fullName[0] != '/') && (fullName.find("://") == string::npos)) {
111 using namespace WrtDeviceApis::Commons;
112 std::string installationPath;
113 int widgetId = WrtAccessSingleton::Instance().getWidgetId();
115 WidgetDB::Api::IWidgetDBPtr widgetDB =
116 WidgetDB::Api::getWidgetDB(widgetId);
117 installationPath = widgetDB->getConfigValue(
118 WidgetDB::Api::ConfigAttribute::INSTALL_PATH);
120 LogInfo("Config attribute: " << installationPath);
121 fullName.insert(0, installationPath);
122 } catch (const Commons::Exception &ex) {
123 LogError("Obtaining config info failed");
124 event->setExceptionCode(ex.getCode());
129 LogDebug("Opening file: " << fullName);
130 char *errorBuffer = NULL;
131 err = mm_player_set_attribute(
132 player->getHandler(), &errorBuffer, "profile_uri",
133 fullName.c_str(), fullName.length(), NULL);
134 if (MM_ERROR_NONE != err) {
136 "Setting attribute error. Code: " << std::hex << err <<
137 ". Message: " << errorBuffer);
139 event->setExceptionCode(Commons::ExceptionCodes::PlatformException);
143 err = mm_player_realize(player->getHandler());
144 if (MM_ERROR_NONE != err) {
145 LogError("Can't realize player. Error code:" << std::hex << err);
146 if (static_cast<int>(MM_ERROR_PLAYER_INVALID_URI) == err) {
148 event->setExceptionCode(
149 Commons::ExceptionCodes::InvalidArgumentException);
151 event->setExceptionCode(Commons::ExceptionCodes::PlatformException);
156 if (player->getEmitter()) {
157 EventOnStateChangePtr eventStateChanged(new EventOnStateChange(
158 EventOnStateChange::OPENED));
159 player->getEmitter()->emit(eventStateChanged);
163 void Manager::OnRequestReceived(const EventPlayPtr& event)
167 MMPlayerPtr player = DPL::DynamicPointerCast<MMPlayer>(event->getPlayer());
169 LogError("MMPlayerPtr cast error");
170 event->setExceptionCode(Commons::ExceptionCodes::PlatformException);
174 //Check if player currently plays media
175 if (MM_PLAYER_STATE_PLAYING == player->getState() || 0 ==
176 event->getRepeatTimes()) {
177 LogDebug("already playing");
180 player->setRepeatTimes(event->getRepeatTimes() - 1);
182 int err = mm_player_start(player->getHandler());
183 if (MM_ERROR_NONE != err) {
184 LogError("Can't start play. Error code: " << std::hex << err);
185 event->setExceptionCode(Commons::ExceptionCodes::PlatformException);
187 //Event onStateChange will be emitted trough platform callback
190 void Manager::OnRequestReceived(const EventPausePtr& event)
194 MMPlayerPtr player = DPL::DynamicPointerCast<MMPlayer>(event->getPlayer());
196 LogError("MMPlayerPtr cast error");
197 event->setExceptionCode(Commons::ExceptionCodes::PlatformException);
200 if (MM_PLAYER_STATE_PLAYING != player->getState()) {
204 int err = mm_player_pause(player->getHandler());
205 if (MM_ERROR_NONE != err) {
206 event->setExceptionCode(Commons::ExceptionCodes::PlatformException);
208 if (player->getEmitter()) {
209 EventOnStateChangePtr eventStateChanged(new EventOnStateChange(
210 EventOnStateChange::PAUSED));
211 player->getEmitter()->emit(eventStateChanged);
215 void Manager::OnRequestReceived(const EventResumePtr& event)
219 MMPlayerPtr player = DPL::DynamicPointerCast<MMPlayer>(event->getPlayer());
221 LogError("MMPlayerPtr cast error");
222 event->setExceptionCode(Commons::ExceptionCodes::PlatformException);
225 if (MM_PLAYER_STATE_PAUSED != player->getState()) {
229 int err = mm_player_resume(player->getHandler());
230 if (MM_ERROR_NONE != err) {
231 LogError("Can't resume player. Error code: " << std::hex << err);
232 event->setExceptionCode(Commons::ExceptionCodes::PlatformException);
234 if (player->getEmitter()) {
235 EventOnStateChangePtr eventStateChanged(new EventOnStateChange(
236 EventOnStateChange::RESUMED));
237 player->getEmitter()->emit(eventStateChanged);
241 void Manager::OnRequestReceived(const EventStopPtr& event)
245 MMPlayerPtr player = DPL::DynamicPointerCast<MMPlayer>(event->getPlayer());
247 LogError("MMPlayerPtr cast error");
248 event->setExceptionCode(Commons::ExceptionCodes::PlatformException);
251 if (MM_PLAYER_STATE_PLAYING != player->getState() &&
252 MM_PLAYER_STATE_PAUSED != player->getState()) {
256 int err = mm_player_stop(player->getHandler());
257 if (MM_ERROR_NONE != err) {
258 LogError("Can't stop player. Error code: " << std::hex << err);
259 event->setExceptionCode(Commons::ExceptionCodes::PlatformException);
262 if (player->getEmitter()) {
263 EventOnStateChangePtr eventStateChanged(new EventOnStateChange(
264 EventOnStateChange::STOPPED));
265 player->getEmitter()->emit(eventStateChanged);
269 void Manager::OnRequestReceived(const EventSetWindowPtr& /*event*/)
272 LogError("Not implemented");
273 //TODO: set display parameter, when xID will be available
276 void Manager::OnRequestReceived(const EventIsPlayingPtr& event)
280 MMPlayerPtr player = DPL::DynamicPointerCast<MMPlayer>(event->getPlayer());
284 LogError("MMPlayerPtr cast error");
285 event->setExceptionCode(Commons::ExceptionCodes::PlatformException);
288 event->setIsPlaying(MM_PLAYER_STATE_PLAYING == player->getState());
290 Catch(Commons::PlatformException)
292 LogError("Can't get player status.");
293 event->setExceptionCode(Commons::ExceptionCodes::PlatformException);
298 void Manager::OnRequestReceived(const EventGetVolumePtr& event)
301 unsigned int volume = 0;
304 int err = mm_sound_volume_get_step(VOLUME_TYPE_MEDIA, &steps);
305 if (MM_ERROR_NONE != err) {
307 "Can't get volume steps count. Error code: " << std::hex <<
309 event->setExceptionCode(Commons::ExceptionCodes::PlatformException);
312 LogInfo("Volume steps count: " << steps);
315 err = mm_sound_volume_get_value(VOLUME_TYPE_MEDIA, &volume);
316 if (MM_ERROR_NONE != err) {
318 "Can't get player's volume. Error code: " << std::hex <<
320 Throw(Commons::UnknownException);
322 LogInfo("Platform player's volume: " << volume);
324 event->setVolume((10.0 * volume) / (steps - 1));
326 LogError("no steps defined");
330 catch (const Commons::UnknownException &ex)
332 LogError("Can't scale the volume");
333 event->setExceptionCode(Commons::ExceptionCodes::PlatformException);