summaryrefslogtreecommitdiffstats
path: root/amarok/src/engine/nmm/nmm_engine.h
blob: 43630cb4198847397a5ec8d31848fc4333328489 (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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
/* NMM - Network-Integrated Multimedia Middleware
 *
 * Copyright (C) 2002-2006
 *                    NMM work group,
 *                    Computer Graphics Lab,
 *                    Saarland University, Germany
 *                    http://www.networkmultimedia.org
 *
 * Maintainer:        Robert Gogolok <[email protected]>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston, MA  02110-1301
 * USA
 */


#ifndef NMM_ENGINE_H
#define NMM_ENGINE_H

#include <config.h>

#include "enginebase.h"
#include "NmmLocation.h"
#include <nmm/base/graph/CompositeNode.hpp>
#include <nmm/base/NMMApplication.hpp>
#include <nmm/base/EDObject.hpp>
#include <nmm/base/sync/MultiAudioVideoSynchronizer.hpp>

using namespace NMM;

/**
 * \todo currently every song/video change means a stop and restart of the NMM environment.
 */
class NmmEngine : public Engine::Base
{
Q_OBJECT
  
public:
    NmmEngine();
    ~NmmEngine();

    bool init();
    bool canDecode(const KURL&) const;

    uint position() const;

    uint length() const;

    Engine::State state() const;

    Amarok::PluginConfig* configure() const;

    TQValueList<NmmLocation> environmentHostList() const {return tmp_environment_list;}
    void setEnvironmentHostList(TQValueList<NmmLocation> list) { tmp_environment_list = list;}

    TQValueList<NmmLocation> userHostList() const {return tmp_user_list;}
    void setUserHostList(TQValueList<NmmLocation> list) { tmp_user_list = list;}


    static NmmEngine* instance() { return s_instance; }

public slots:
    bool  load(const KURL&, bool stream = false);
    bool  play(unsigned int offset = 0);
    void  stop();
    void  pause();
    void  seek(uint);

private slots:
    void endOfStreamReached();

    /**
     * Checks for local NMM security options.
     * Warns user if ~/.nmmrc doesn't have
     * allowedwritepaths or allowedreadpaths set.
     * TODO: Should be called on NMM engine load and not from ::load.
     */
    void checkSecurity();

    /**
     * Updates error type in tmp_environment_list and tmp_user_list for a host.
     * \param hostname host the error is related to
     * \param error error identification, see NMMEngineException::Error
     */
    void notifyHostError( TQString hostname, int error );

signals:
    /**
     * Emitted when an error occurred during NMM setup.
     * \param hostname host the error is related to
     * \param error error identification, see NMMEngineException::Error
     */
    void hostError( TQString hostname, int error );

protected:
    void  setVolumeSW( uint );

private:

    /**
     * Resets current NMM environment and other configurations.
     */
    void cleanup();

    /**
     * \todo document
     */
    void createEnvironmentHostList();

    /**
     * \todo document
     */
    void createUserHostList();

    /**
     * Returns sink locations for audio/video playback.
     *
     * \param audio return audio locations, else video locations
     *
     * \return the audio/video locations
     */
    TQStringList getSinkHosts( bool audio = true );

    /**
     * This method is called when a setProgress event is received. The two parameters represent a rational number
     * (numerator and denominator) containing the amount of progress as a value between 0 and 1.
     */
    Result setProgress(u_int64_t&, u_int64_t&);

    /**
     * This method is called when an endTrack event is received.
     */
    Result endTrack();

    /**
     * This method is called when a syncReset event is received. When an NMM source node has finished seeking, such an event is
     * sent. Here, it is used to prevent the engine from updating the track position while receiving setProgress events before seeking
     * is done, since these setProgress events may contain old progress information. Otherwise, the progress slider would jump
     * back and forth...
     */
    Result syncReset();

    /**
     * This method is called when a trackDuration event is received. The duration of a track is represented by
     * an Interval that contains the time in seconds and nanoseconds.
     */
    Result trackDuration(Interval& duration);

    /**
     * The current track position in milliseconds.
     */
    u_int64_t __position;

    /**
     * The length of the track in milliseconds.
     */
    u_int64_t __track_length;

    /**
     * The current engine state
     */
    Engine::State __state;

    /**
     * The NMM application object.
     */
    NMMApplication* __app;

    /**
     * Event listeners for various NMM events.
     */
    TEDObject0<NmmEngine> __endTrack_listener;
    TEDObject0<NmmEngine> __syncReset_listener;
    TEDObject2<NmmEngine, u_int64_t, u_int64_t> __setProgress_listener;
    TEDObject1<NmmEngine, Interval> __trackDuration_listener;

    /**
     * The composite node that contains the graph created by the GraphBuilder.
     */
    CompositeNode* __composite;

    /**
     * The node for audio playback
     * where the various events like endTrack, setProgress etc. are caught
     * if video is disabled.
     */
    INode* __playback;

    /**
     * The display node for video playback
     * where the various events like endTrack, setProgress etc. are caught
     * if video is enabled.
     */
    INode* __display;

    /**
     * synchronizer for graph builder
     */
    MultiAudioVideoSynchronizer* __av_sync;

    /**
     * synchronizer interface
     */
    IMultiAudioVideoSynchronizer* __synchronizer;

    /**
     * Indicates whether we are playing a video.
     */
    bool __with_video;

    /**
     * This flag is set during seeking.
     */
    bool __seeking;

    /**
     * Used to determine whether an errorDialog is being displayed
     * in 'localhost only' mode. No track should be played till
     * the user clicked 'Ok'.
     */
    bool m_localhostonly_errordialog;

    /**
     * Environment variables host list.
     * Only read on startup, volume can be changed via settings dialog.
     */
    TQValueList<NmmLocation> tmp_environment_list;

     /**
      * User host list.
      */
    TQValueList<NmmLocation> tmp_user_list;

    static NmmEngine* s_instance;

public:
    enum HostStatus {
      STATUS_UNKNOWN = 0,
      STATUS_OK            = 1 << 0,
      ERROR_PLAYBACKNODE   = 1 << 1,
      ERROR_DISPLAYNODE    = 1 << 2,
    };
};

class NMMEngineException {
  public:
    NMMEngineException(std::string _hostname, int _error)
      : hostname( _hostname ), error( _error ) {}

    std::string hostname;
    int error;
};

#endif