summaryrefslogtreecommitdiff
path: root/src/libplayback-wrapper.cpp
blob: ce3a43d8a987e5e40d657439e249c2a0fa466373 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#include "libplayback-wrapper.h"

using namespace ResourceTypes;
static inline enum pb_class_e resourceClassToLibPlaybackClass(enum ResourceClass resourceClass);
static inline quint16 resourceFlagsToLibPlaybackFlags(quint16 resourceFlags);
static inline enum ResourceState libPlaybackStateToResourceState(enum pb_state_e libPlaybackState);
static void libPlaybackStateHandler(pb_playback_t *libPlaybackHandler, enum pb_state_e newState,
				    pb_req_t* playbackRequest, void *data);
static void libPlaybackStateHintHandler(pb_playback_t *libPlaybackHandler, const int allowedStates[], void *data);

LibPlaybackWrapper::LibPlaybackWrapper(Resource *res)
    : QObject(res), dbusConnection(NULL), libPlaybackHandle(NULL)
{
    resource = res;
}

LibPlaybackWrapper::~LibPlaybackWrapper()
{
    pb_playback_destroy(libPlaybackHandle);
}

bool LibPlaybackWrapper::initialize()
{
    DBusError dbusError;
    dbus_error_init(&dbusError);
    dbusConnection = dbus_bus_get(DBUS_BUS_SESSION, &dbusError);
    qDebug("dbusConnection=%p", dbusConnection);
    if (dbus_error_is_set(&dbusError)) {
	qDebug("D-Bus Connection Error (%s)\n", dbusError.message);
	dbus_error_free(&dbusError);
	return false;
    }
    if(dbusConnection == NULL) {
	qDebug("Unable to connect to dbus, dbusConnection == NULL!");
	return false;
    }
    return true;
}

bool LibPlaybackWrapper::connectToServer()
{
    enum pb_class_e libPlaybackClass = resourceClassToLibPlaybackClass(resource->applicationClass());
    quint16 libPlaybackFlags = resourceFlagsToLibPlaybackFlags(resource->resources());

    qDebug("libPlaybackFlags=%02x resources=%02x",libPlaybackFlags, resource->resources());
    qDebug("dbusConnection=%p", dbusConnection);

    libPlaybackHandle = pb_playback_new_2(dbusConnection, libPlaybackClass, libPlaybackFlags,
					  PB_STATE_STOP, libPlaybackStateHandler, this);
    if(libPlaybackHandle == NULL) {
	return false;
    }
    return true;
}

inline enum pb_class_e resourceClassToLibPlaybackClass(enum ResourceClass resourceClass)
{
    switch(resourceClass) {
    case InvalidClass:
	return PB_CLASS_NONE;
    case CallClass:
	return PB_CLASS_CALL;
    case MediaClass:
	return PB_CLASS_MEDIA;
    case BackgroundClass:
	return PB_CLASS_BACKGROUND;
    case RingtoneClass:
	return PB_CLASS_RINGTONE;
    case VoiceUIClass:
	return PB_CLASS_VOICEUI;
    case CameraClass:
	return PB_CLASS_CAMERA;
    case GameClass:
	return PB_CLASS_GAME;
    case AlarmClass:
	return PB_CLASS_ALARM;
    case FlashClass:
	return PB_CLASS_FLASH;
    case SystemClass:
	return PB_CLASS_SYSTEM;
    case InputClass:
	return PB_CLASS_INPUT;
    default:
	return PB_CLASS_NONE;
    }
}

inline quint16 resourceFlagsToLibPlaybackFlags(quint16 resourceFlags)
{
    quint16 libPlaybackFlags = 0;
    for (int flag=AudioResource;flag<VideoRecorderResource;flag=flag<<1) {
	if((resourceFlags & flag) == flag) {
	    switch(flag) {
	    case AudioResource:
		libPlaybackFlags += PB_FLAG_AUDIO;
		break;
	    case VideoResource:
		libPlaybackFlags += PB_FLAG_VIDEO;
		break;
	    case AudioRecorderResource:
		libPlaybackFlags += PB_FLAG_AUDIO_RECORDING;
		break;
	    case VideoRecorderResource:
		libPlaybackFlags += PB_FLAG_VIDEO_RECORDING;
		break;
	    }
	}
    }
    return libPlaybackFlags;
}

void libPlaybackStateHandler(pb_playback_t *libPlaybackHandler, enum pb_state_e newState,
			     pb_req_t* playbackRequest, void *data)
{
    LibPlaybackWrapper *libPlaybackWrapper = static_cast<LibPlaybackWrapper*>(data);

    pb_playback_req_completed(libPlaybackHandler, playbackRequest);
    libPlaybackWrapper->stateChanged(newState);
}

void LibPlaybackWrapper::stateChanged(enum pb_state_e newState)
{
    enum ResourceState resourceState;
    resourceState = libPlaybackStateToResourceState(newState);
    
    resource->handleStateChange(resourceState);
}

inline enum ResourceState libPlaybackStateToResourceState(enum pb_state_e libPlaybackState)
{
    switch(libPlaybackState) {
    case PB_STATE_STOP:
	return NotOwnedState;
    case PB_STATE_PLAY:
	return OwnedState;
    default:
	return UnknownState;
    }	
}

static void libPlaybackStateHintHandler(pb_playback_t *libPlaybackHandler, const int allowedStates[], void *data)
{
    LibPlaybackWrapper *libPlaybackWrapper = static_cast<LibPlaybackWrapper*>(data);

    libPlaybackWrapper->hintReceived(allowedStates);
}

void LibPlaybackWrapper::hintReceived(const int allowedStates[])
{
    if(allowedStates[PB_STATE_PLAY]) {
	resource->emitReservable();
    }
    // Ignore PB_STATE_STOP
/*    else if(allowedStates[PB_STATE_STOP]) {
	
    }
*/
}

bool LibPlaybackWrapper::reserve()
{
    return false;
}