1 /*  This file is part of the KDE project.
2 
3     Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4 
5     This library is free software: you can redistribute it and/or modify
6     it under the terms of the GNU Lesser General Public License as published by
7     the Free Software Foundation, either version 2.1 or 3 of the License.
8 
9     This library is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU Lesser General Public License for more details.
13 
14     You should have received a copy of the GNU Lesser General Public License
15     along with this library.  If not, see <http://www.gnu.org/licenses/>.
16 */
17 
18 #ifndef Phonon_QT7_BACKENDHEADER_H
19 #define Phonon_QT7_BACKENDHEADER_H
20 
21 #include <QtCore/QString>
22 #import <Foundation/NSAutoreleasePool.h>
23 #include <CoreFoundation/CFBase.h>
24 
25 #ifndef Q_WS_MAC64
26 #define QUICKTIME_C_API_AVAILABLE
27 #endif
28 
29 QT_BEGIN_NAMESPACE
30 
31 namespace Phonon
32 {
33 namespace QT7
34 {
35 
36 // Implemented in error.cpp:
37 void gSetErrorString(const QString &errorString);
38 QString gGetErrorString();
39 void gSetErrorLocation(const QString &errorLocation);
40 void gSetErrorType(int type);
41 int gGetErrorType();
42 void gClearError();
43 
44 #define NO_ERROR 0
45 #define NORMAL_ERROR 1
46 #define FATAL_ERROR 2
47 
48 #define ERROR_LOCATION                                              \
49     QLatin1String("Function: ") + QLatin1String(__FUNCTION__)       \
50     + QLatin1String(", File: ") + QLatin1String(__FILE__)           \
51     + QLatin1String(", Line: ") + QString::number(__LINE__)
52 
53 #define SET_ERROR(string, type){                                \
54         Phonon::QT7::gSetErrorString(string);    \
55         Phonon::QT7::gSetErrorType(type);                       \
56         Phonon::QT7::gSetErrorLocation(ERROR_LOCATION); }
57 
58 #define BACKEND_ASSERT(test, string, type)      \
59     bool fail = !test;                          \
60     if (fail)                                   \
61         SET_ERROR(QLatin1String(string), type)  \
62     if (fail)
63 
64 #define BACKEND_ASSERT2(test, string, type)     \
65     if (!(test)) {                              \
66         SET_ERROR(QLatin1String(string), type)  \
67         return;                                 \
68     }
69 
70 #define BACKEND_ASSERT3(test, string, type, ret)    \
71     if (!(test)) {                                  \
72         SET_ERROR(QLatin1String(string), type)      \
73         return ret;                                 \
74     }
75 
76 #define ARGUMENT_UNSUPPORTED(a, x, type, ret)                           \
77     if ((a) == (x)) {                                                   \
78         SET_ERROR("Argument value not supported: "#a" == "#x, type);    \
79         return ret;                                                     \
80     }
81 
82 #define CASE_UNSUPPORTED(string, type) SET_ERROR(string, type)
83 
84 #ifdef SET_DEBUG_IMPLEMENTED
85 #define IMPLEMENTED qDebug() << "QT7:" << __FUNCTION__ << "(" << __FILE__ << "):"
86 #else
87 #define IMPLEMENTED if (1); else qDebug()
88 #endif
89 
90 #ifdef SET_DEBUG_HALF_IMPLEMENTED
91 #define HALF_IMPLEMENTED qDebug() << "QT7: --- HALF IMPLEMENTED:" << __FUNCTION__ << "(" << __FILE__ << "," << __LINE__ << "):"
92 #else
93 #define HALF_IMPLEMENTED if (1); else qDebug()
94 #endif
95 
96 #ifdef SET_DEBUG_NOT_IMPLEMENTED
97 #define NOT_IMPLEMENTED qDebug() << "QT7: *** NOT IMPLEMENTED:" << __FUNCTION__ << "(" << __FILE__ << "," << __LINE__ << "):"
98 #else
99 #define NOT_IMPLEMENTED if (1); else qDebug()
100 #endif
101 
102 #ifdef SET_DEBUG_IMPLEMENTED_SILENT
103 #define IMPLEMENTED_SILENT qDebug() << "QT7: (silent)" << __FUNCTION__ << "(" << __FILE__ << "," << __LINE__ << "):"
104 #else
105 #define IMPLEMENTED_SILENT if (1); else qDebug()
106 #endif
107 
108 #ifdef SET_DEBUG_AUDIO_GRAPH
109 #define DEBUG_AUDIO_GRAPH(x) qDebug() << "QT7 DEBUG GRAPH:" << x;
110 #else
111 #define DEBUG_AUDIO_GRAPH(x) {}
112 #endif
113 
114 #ifdef SET_DEBUG_AUDIO_STREAM
115 #define DEBUG_AUDIO_STREAM(x) qDebug() << "QT7 DEBUG STREAM:" << x;
116 #else
117 #define DEBUG_AUDIO_STREAM(x) {}
118 #endif
119 
120 /////////////////////////////////////////////////////////////////////////////////////////
121 
122 class PhononAutoReleasePool
123 {
124 private:
125     void *pool;
126 public:
127     PhononAutoReleasePool();
128     ~PhononAutoReleasePool();
129 };
130 
131 /////////////////////////////////////////////////////////////////////////////////////////
132 
133 template <typename T>
134 class PhononCFType
135 {
136 public:
type(t)137     inline PhononCFType(const T &t = 0) : type(t) {}
PhononCFType(const PhononCFType & helper)138     inline PhononCFType(const PhononCFType &helper) : type(helper.type) { if (type) CFRetain(type); }
~PhononCFType()139     inline ~PhononCFType() { if (type) CFRelease(type); }
T()140     inline operator T() { return type; }
141     inline PhononCFType operator =(const PhononCFType &helper)
142     {
143 	if (helper.type)
144 	    CFRetain(helper.type);
145 	CFTypeRef type2 = type;
146 	type = helper.type;
147 	if (type2)
148 	    CFRelease(type2);
149 	return *this;
150     }
151     inline T *operator&() { return &type; }
constructFromGet(const T & t)152     static PhononCFType constructFromGet(const T &t)
153     {
154         CFRetain(t);
155         return PhononCFType<T>(t);
156     }
157 protected:
158     T type;
159 };
160 
161 /////////////////////////////////////////////////////////////////////////////////////////
162 
163 class PhononCFString : public PhononCFType<CFStringRef>
164 {
165 public:
PhononCFString(const QString & str)166     inline PhononCFString(const QString &str) : PhononCFType<CFStringRef>(0), string(str) {}
167     inline PhononCFString(const CFStringRef cfstr = 0) : PhononCFType<CFStringRef>(cfstr) {}
PhononCFString(const PhononCFType<CFStringRef> & other)168     inline PhononCFString(const PhononCFType<CFStringRef> &other) : PhononCFType<CFStringRef>(other) {}
169     operator QString() const;
170     operator CFStringRef() const;
171     static QString toQString(CFStringRef cfstr);
172     static CFStringRef toCFStringRef(const QString &str);
173 private:
174     QString string;
175 };
176 }} //namespace Phonon::QT7
177 
178 QT_END_NAMESPACE
179 
180 #ifdef Q_CC_INTEL
181 #pragma warning (disable : 1899) // mute icc warning for the use of 4cc
182 #endif
183 
184 #endif // Phonon_QT7_BACKENDHEADER_H
185