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