56 #include <private/qcore_unix_p.h> 63 #include <sys/types.h> 65 #include <sys/ioctl.h> 66 #include <sys/soundcard.h> 76 #define QT_QWS_SOUND_16BIT 1 // or 0, or undefined for always 0 77 #define QT_QWS_SOUND_STEREO 1 // or 0, or undefined for always 0 82 #ifndef QT_NO_QWS_SOUNDSERVER 94 #if defined(QT_QWS_IPAQ) 104 #ifdef QT_QWS_SOUND_STEREO 109 #ifdef QT_QWS_SOUND_16BIT 115 #ifndef QT_NO_QWS_SOUNDSERVER 124 void sendSoundCompleted(
int,
int);
125 void sendDeviceReady(
int,
int);
126 void sendDeviceError(
int,
int,
int);
129 void play(
int,
int,
const QString&);
130 void play(
int,
int,
const QString&,
int,
int);
131 void playRaw(
int,
int,
const QString&,
int,
int,
int,
int);
133 void pause(
int,
int);
135 void resume(
int,
int);
136 void setVolume(
int,
int,
int,
int);
137 void setMute(
int,
int,
bool);
141 void playPriorityOnly(
bool);
143 void setSilent(
bool );
146 void tryReadCommand();
149 void sendClientMessage(
QString msg);
201 while (
socket->canReadLine() ) {
233 bool sPri = soundid != 0;
246 #ifndef QT_NO_TEXTCODEC 283 : mWid(w), mSid(s), mMuted(false)
289 max1 = max2 = out = 0;
317 if (p != isPriority) {
330 if (priorityExists < 0)
331 qDebug(
"QSS: got more priority offs than ons");
338 virtual int readySamples(
int) = 0;
350 int add(
int* mixl,
int* mixr,
int count)
352 int bytesPerSample = chunkdata.wBitsPerSample >> 3;
355 sampleRunin -=
qMin(sampleRunin,count);
356 while (count && (dev != -1)) {
360 if (
data == data1 && max2 != 0) {
364 }
else if (
data == data2 && max1 != 0) {
369 qDebug(
"QSS Read Error: both buffers empty");
374 while (count && samples_due >= chunkdata.samplesPerSec) {
375 samples_due -= chunkdata.samplesPerSec;
378 out += bytesPerSample * chunkdata.channels;
384 if ( !mixl || !mixr )
387 int lVolNum = leftVolume, lVolDen =
maxVolume;
388 int rVolNum = rightVolume, rVolDen =
maxVolume;
389 if (priorityExists > 0 && !isPriority) {
396 while (count && (dev != -1)) {
400 if (
data == data1 && max2 != 0) {
404 }
else if (
data == data2 && max1 != 0) {
409 qDebug(
"QSS Read Error: both buffers empty");
414 if (count && samples_due >= chunkdata.samplesPerSec) {
415 int l = getSample(0,bytesPerSample)*lVolNum/lVolDen;
416 int r = (chunkdata.channels == 2) ? getSample(1,bytesPerSample)*rVolNum/rVolDen :
l;
420 while (sampleRunin && count && samples_due >= chunkdata.samplesPerSec) {
424 samples_due -= chunkdata.samplesPerSec;
429 while (count && samples_due >= chunkdata.samplesPerSec) {
433 samples_due -= chunkdata.samplesPerSec;
439 out += bytesPerSample * chunkdata.channels;
445 virtual bool finished()
const = 0;
449 return (wid == mWid && sid == mSid);
459 return (
char *)data2;
462 return (
char *)data1;
483 int possible = (((max1+max2-out) / ((chunkdata.wBitsPerSample>>3)*chunkdata.channels))
524 wavedata_remaining = -1;
525 mFinishedRead =
false;
526 mInsufficientSamples =
false;
536 return mInsufficientSamples && mFinishedRead ;
541 char *dest = prepareBuffer(size);
547 if (size > 0 && dest != 0) {
548 while ( wavedata_remaining < 0 ) {
550 wavedata_remaining = -1;
552 const int n =
sizeof(chunk)-
sizeof(chunk.data);
553 int nr = ::read(dev, (
void*)&chunk,n);
556 wavedata_remaining = 0;
557 mFinishedRead =
true;
558 }
else if (
qstrncmp(chunk.id,
"data",4) == 0 ) {
563 }
else if (
qstrncmp(chunk.id,
"RIFF",4) == 0 ) {
565 if ( read(dev, d, 4) != 4 ) {
568 mInsufficientSamples =
true;
569 mFinishedRead =
true;
571 }
else if (
qstrncmp(d,
"WAVE",4) != 0 ) {
573 if ( chunk.size > 1000000000 || lseek(dev,chunk.size-4, SEEK_CUR) == -1 ) {
575 mFinishedRead =
true;
578 }
else if (
qstrncmp(chunk.id,
"fmt ",4) == 0 ) {
579 if ( ::read(dev,(
char*)&chunkdata,
sizeof(chunkdata)) !=
sizeof(chunkdata) ) {
582 mFinishedRead =
true;
585 #define WAVE_FORMAT_PCM 1 594 chunkdata.avgBytesPerSec =
qToLittleEndian( chunkdata.avgBytesPerSec );
596 chunkdata.wBitsPerSample =
qToLittleEndian( chunkdata.wBitsPerSample );
598 qWarning(
"WAV file: UNSUPPORTED FORMAT %d",chunkdata.formatTag);
599 mFinishedRead =
true;
604 if ( chunk.size > 1000000000 || lseek(dev, chunk.size, SEEK_CUR) == -1) {
606 mFinishedRead =
true;
611 if (wavedata_remaining <= 0) {
612 mFinishedRead =
true;
622 if (wavedata_remaining) {
623 if (size > 0 && dest != 0) {
624 int read = ::read(dev, dest,
qMin(size, wavedata_remaining));
626 wavedata_remaining -= read;
629 mFinishedRead =
true;
632 int possible = devSamples();
634 mInsufficientSamples =
true;
652 chunkdata.samplesPerSec = f;
653 chunkdata.wBitsPerSample = b;
676 char *dest = prepareBuffer(size);
677 if (size > 0 && dest != 0 && dev != -1) {
679 int read = ::read(dev, dest, size);
691 }
else if (read == 0) {
700 int possible = devSamples();
710 #ifndef QT_NO_QWS_SOUNDSERVER 711 QWSSoundServerSocket::QWSSoundServerSocket(
QObject *
parent) :
714 connect(
this,
SIGNAL(newConnection()),
this,
SLOT(newConnection()));
719 QWSSoundServerSocket::QWSSoundServerSocket(
QObject *parent,
const char *
name) :
724 connect(
this,
SIGNAL(newConnection()),
this,
SLOT(newConnection()));
728 void QWSSoundServerSocket::newConnection()
737 connect(client,
SIGNAL(playRaw(
int,
int,
QString,
int,
int,
int,
int)),
740 connect(client,
SIGNAL(pause(
int,
int)),
741 this,
SIGNAL(pauseFile(
int,
int)));
742 connect(client,
SIGNAL(stop(
int,
int)),
743 this,
SIGNAL(stopFile(
int,
int)));
744 connect(client,
SIGNAL(playPriorityOnly(
bool)),
745 this,
SIGNAL(playPriorityOnly(
bool)));
746 connect(client,
SIGNAL(stopAll(
int)),
747 this,
SIGNAL(stopAll(
int)));
748 connect(client,
SIGNAL(resume(
int,
int)),
749 this,
SIGNAL(resumeFile(
int,
int)));
751 connect(client,
SIGNAL(setSilent(
bool)),
752 this,
SIGNAL(setSilent(
bool)));
759 connect(
this,
SIGNAL(soundFileCompleted(
int,
int)),
760 client,
SLOT(sendSoundCompleted(
int,
int)));
761 connect(
this,
SIGNAL(deviceReady(
int,
int)),
762 client,
SLOT(sendDeviceReady(
int,
int)));
763 connect(
this,
SIGNAL(deviceError(
int,
int,
int)),
764 client,
SLOT(sendDeviceError(
int,
int,
int)));
780 #ifndef QT_NO_QWS_SOUNDSERVER 781 server =
new QWSSoundServerSocket(
this);
788 this,
SLOT(playRawFile(
int,
int,
QString,
int,
int,
int,
int)));
791 this,
SLOT(pauseFile(
int,
int)));
793 this,
SLOT(stopFile(
int,
int)));
795 this,
SLOT(stopAll(
int)));
797 this,
SLOT(playPriorityOnly(
bool)));
799 this,
SLOT(resumeFile(
int,
int)));
802 this,
SLOT(setSilent(
bool)));
809 connect(
this,
SIGNAL(soundFileCompleted(
int,
int)),
811 connect(
this,
SIGNAL(deviceReady(
int,
int)),
813 connect(
this,
SIGNAL(deviceError(
int,
int,
int)),
820 can_GETOSPACE =
true;
830 void soundFileCompleted(
int,
int);
831 void deviceReady(
int,
int);
832 void deviceError(
int,
int,
int);
835 void playRawFile(
int wid,
int sid,
const QString &filename,
int freq,
int channels,
int bitspersample,
int flags);
836 void playFile(
int wid,
int sid,
const QString& filename);
837 void playFile(
int wid,
int sid,
const QString& filename,
int v,
int flags);
839 void pauseFile(
int wid,
int sid);
840 void resumeFile(
int wid,
int sid);
841 void stopFile(
int wid,
int sid);
842 void stopAll(
int wid);
843 void setVolume(
int wid,
int sid,
int lv,
int rv);
844 void setMute(
int wid,
int sid,
bool m);
845 void playPriorityOnly(
bool p);
846 void sendCompletedSignals();
847 void feedDevice(
int fd);
848 void setSilent(
bool enabled );
854 int openFile(
int wid,
int sid,
const QString& filename);
890 #ifndef QT_NO_QWS_SOUNDSERVER 899 if( !unwritten && !active.count() ) {
900 sendCompletedSignals();
903 killTimer( timerId );
906 if( unwritten || active.count() ) {
914 if( event->
timerId() == timerId ) {
925 int freq,
int channels,
int bitspersample,
int flags)
927 #ifdef QT_NO_QWS_SOUNDSERVER 930 int f = openFile(wid, sid, filename);
934 checkPresetVolumes(wid, sid, b);
935 #ifndef QT_NO_QWS_SOUNDSERVER 936 b->
setPriority((flags & QWSSoundClient::Priority) == QWSSoundClient::Priority);
939 emit deviceReady(wid, sid);
945 int f = openFile(wid, sid, filename);
948 checkPresetVolumes(wid, sid, b);
950 emit deviceReady(wid, sid);
957 #ifdef QT_NO_QWS_SOUNDSERVER 960 int f = openFile(wid, sid, filename);
963 checkPresetVolumes(wid, sid, b);
965 #ifndef QT_NO_QWS_SOUNDSERVER 966 b->
setPriority((flags & QWSSoundClient::Priority) == QWSSoundClient::Priority);
969 emit deviceReady(wid, sid);
976 while (it != volumes.end()) {
978 if (v.
wid == wid && v.
sid == sid) {
981 it = volumes.erase(it);
992 for (
int i = 0; i < active.size(); ++i ) {
993 bucket = active.at(i);
994 if (bucket->
equal(wid, sid)) {
997 inactive.append(bucket);
1006 for (
int i = 0; i < inactive.size(); ++i ) {
1007 bucket = inactive.at(i);
1008 if (bucket->
equal(wid, sid)) {
1010 inactive.removeAt(i);
1011 active.append(bucket);
1020 for (
int i = 0; i < active.size(); ++i ) {
1021 bucket = active.at(i);
1022 if (bucket->
equal(wid, sid)) {
1028 for (
int i = 0; i < inactive.size(); ++i ) {
1029 bucket = inactive.at(i);
1030 if (bucket->
equal(wid, sid)) {
1031 inactive.removeAt(i);
1041 if (!active.isEmpty()) {
1043 while (it != active.end()) {
1045 if (bucket->
groupId() == wid) {
1046 it = active.erase(it);
1053 if (!inactive.isEmpty()) {
1055 while (it != inactive.end()) {
1057 if (bucket->
groupId() == wid) {
1058 it = inactive.erase(it);
1070 for(
int i = 0; i < active.size(); ++i ) {
1071 bucket = active.at(i);
1072 if (bucket->
equal(wid, sid)) {
1080 while (it != volumes.end()) {
1082 if (v.
wid == wid && v.
sid == sid)
1083 it = volumes.erase(it);
1100 for(
int i = 0; i < active.size(); ++i ) {
1101 bucket = active.at(i);
1102 if (bucket->
equal(wid, sid)) {
1110 while (it != volumes.end()) {
1112 if (v.
wid == wid && v.
sid == sid) {
1135 while( !completed.isEmpty() ) {
1136 emit soundFileCompleted( (*completed.begin()).
groupId,
1137 (*completed.begin()).
soundId );
1138 completed.erase( completed.begin() );
1150 #ifndef QT_NO_QWS_SOUNDSERVER 1151 emit deviceError(wid, sid, (
int)QWSSoundClient::ErrOpeningFile );
1153 }
else if ( openDevice() ) {
1156 #ifndef QT_NO_QWS_SOUNDSERVER 1157 emit deviceError(wid, sid, (
int)QWSSoundClient::ErrOpeningAudioDevice );
1169 timerId = startTimer(delay);
1176 bool openOkay =
false;
1178 int flags =
fcntl(fd, F_GETFL);
1179 flags &= ~O_NONBLOCK;
1180 openOkay = (
fcntl(fd, F_SETFL, flags) == 0);
1183 qDebug(
"Failed opening audio device");
1192 if (ioctl(fd, SNDCTL_DSP_SETFRAGMENT, &v))
1193 qWarning(
"Could not set fragments to %08x",v);
1194 #ifdef QT_QWS_SOUND_16BIT 1201 v=AFMT_S16_NE;
if (ioctl(fd, SNDCTL_DSP_SETFMT, &v))
1202 qWarning(
"Could not set format %d",v);
1203 if (AFMT_S16_NE != v)
1204 qDebug(
"Want format %d got %d", AFMT_S16_LE, v);
1206 v=AFMT_U8;
if (ioctl(fd, SNDCTL_DSP_SETFMT, &v))
1207 qWarning(
"Could not set format %d",v);
1209 qDebug(
"Want format %d got %d", AFMT_U8, v);
1212 qWarning(
"Could not set stereo %d",v);
1215 #ifdef QT_QWS_SOUND_STEREO 1219 qWarning(
"Could not set speed %d",v);
1226 timerId = startTimer(delay);
1231 int mixerHandle =
QT_OPEN(
"/dev/mixer",
O_RDWR|O_NONBLOCK );
1232 if ( mixerHandle >= 0 ) {
1234 ioctl( mixerHandle, MIXER_READ(0), &volume );
1235 close( mixerHandle );
1237 qDebug(
"Want sound at %d got %d",
1240 qDebug(
"get volume of audio device failed" );
1248 if ( !unwritten && active.size() == 0 ) {
1250 sendCompletedSignals();
1253 sendCompletedSignals();
1261 for (
int i = 0; i < active.size(); ++i) {
1262 bucket = active.at(i);
1265 available =
qMin(available, ready);
1270 audio_buf_info
info;
1271 if (can_GETOSPACE && ioctl(fd,SNDCTL_DSP_GETOSPACE,&info)) {
1272 can_GETOSPACE =
false;
1273 fcntl(fd, F_SETFL, O_NONBLOCK);
1277 if (info.fragments > 0) {
1280 memset(left,0,available*
sizeof(
int));
1283 memset(right,0,available*
sizeof(
int));
1285 if (running.
size() > 0) {
1287 for (
int i = 0; i < running.
size(); ++i ) {
1288 bucket = running.
at(i);
1289 int unused = bucket->
add(left,right,available);
1293 qDebug(
"provider lied about samples ready");
1297 short *
d = (
short*)
data;
1298 for (
int i=0; i<available; i++) {
1299 *d++ = (short)
qMax(
qMin(left[i],32767),-32768);
1301 *d++ = (short)
qMax(
qMin(right[i],32767),-32768);
1304 signed char *
d = (
signed char *)
data;
1305 for (
int i=0; i<available; i++) {
1306 *d++ = (
signed char)
qMax(
qMin(left[i]/256,127),-128)+128;
1308 *d++ = (
signed char)
qMax(
qMin(right[i]/256,127),-128)+128;
1312 cursor = (
char*)
data;
1319 w = ::write(fd,cursor,unwritten);
1340 while (it != active.end()) {
1344 it = active.erase(it);
1353 QWSSoundServer::QWSSoundServer(
QObject* parent) :
1358 connect(
d,
SIGNAL(soundFileCompleted(
int,
int)),
1359 this,
SLOT(translateSoundCompleted(
int,
int)) );
1362 void QWSSoundServer::playFile(
int sid,
const QString& filename )
1367 d->playFile(0, sid, filename);
1370 void QWSSoundServer::pauseFile(
int sid )
1372 d->pauseFile(0, sid);
1375 void QWSSoundServer::stopFile(
int sid )
1377 d->stopFile(0, sid);
1380 void QWSSoundServer::resumeFile(
int sid )
1382 d->resumeFile(0, sid);
1385 QWSSoundServer::~QWSSoundServer()
1390 void QWSSoundServer::translateSoundCompleted(
int,
int sid )
1392 emit soundCompleted( sid );
1395 #ifndef QT_NO_QWS_SOUNDSERVER 1396 QWSSoundClient::QWSSoundClient(
QObject* parent) :
1401 this,
SLOT(tryReadCommand()));
1406 QWSSoundClient::~QWSSoundClient( )
1411 void QWSSoundClient::reconnect()
1414 if( state() == QWS_SOCK_BASE::ConnectedState )
emit connected();
1418 void QWSSoundClient::sendServerMessage(
QString msg)
1420 #ifndef QT_NO_TEXTCODEC 1429 void QWSSoundClient::play(
int id,
const QString& filename )
1437 void QWSSoundClient::play(
int id,
const QString& filename,
int volume,
int flags)
1447 void QWSSoundClient::pause(
int id )
1453 void QWSSoundClient::stop(
int id )
1459 void QWSSoundClient::resume(
int id )
1465 void QWSSoundClient::playRaw(
int id,
const QString& filename,
1466 int freq,
int chs,
int bitspersample,
int flags)
1478 void QWSSoundClient::setMute(
int id,
bool m )
1484 void QWSSoundClient::setVolume(
int id,
int leftVol,
int rightVol )
1492 void QWSSoundClient::playPriorityOnly(
bool pri )
1498 void QWSSoundClient::setSilent(
bool enable )
1504 void QWSSoundClient::tryReadCommand()
1506 while ( canReadLine() ) {
1515 emit deviceError(token[1].
toInt(),(DeviceErrors)token[2].
toInt());
1520 void QWSSoundClient::emitConnectionRefused()
1528 #include "qsoundqss_qws.moc" 1530 #endif // QT_NO_SOUND static QString number(int, int base=10)
This is an overloaded member function, provided for convenience. It differs from the above function o...
static QString getStringTok(QString &in)
void updateBuffer(int read)
void playRaw(int, int, const QString &, int, int, int, int)
static mach_timebase_info_data_t info
QWSSoundServerStream(int d, int c, int f, int b, int wid, int sid)
Q_DECL_CONSTEXPR const T & qMin(const T &a, const T &b)
#define QT_END_NAMESPACE
This macro expands to.
CompletedInfo(int _groupId, int _soundId)
static QString fromAscii(const char *, int size=-1)
Returns a QString initialized with the first size characters from the string str. ...
void timerEvent(QTimerEvent *event)
This event handler can be reimplemented in a subclass to receive timer events for the object...
char * data()
Returns a pointer to the data stored in the byte array.
static int priorityExists
void playFile(int wid, int sid, const QString &filename)
int toInt(bool *ok=0, int base=10) const
Returns the string converted to an int using base base, which is 10 by default and must be between 2 ...
QWSSoundServerClient(QWS_SOCK_BASE *s, QObject *parent)
#define it(className, varName)
QByteArray toUtf8() const Q_REQUIRED_RESULT
Returns a UTF-8 representation of the string as a QByteArray.
void sendCompletedSignals()
The QByteArray class provides an array of bytes.
int length() const
Returns the number of characters in this string.
void resumeFile(int wid, int sid)
void setVolume(int lv, int rv)
QWSSoundServerPrivate(QObject *parent=0, const char *name=0)
QString absoluteFilePath() const
Returns an absolute path including the file name.
QLatin1String(DBUS_INTERFACE_DBUS))) Q_GLOBAL_STATIC_WITH_ARGS(QString
The QString class provides a Unicode character string.
void checkPresetVolumes(int wid, int sid, QWSSoundServerProvider *p)
The QObject class is the base class of all Qt objects.
bool mInsufficientSamples
QPointer< QWS_SOCK_BASE > socket
void setMute(int, int, bool)
Q_CORE_EXPORT QTextStream & right(QTextStream &s)
Q_DECL_CONSTEXPR const T & qMax(const T &a, const T &b)
void sendDeviceReady(int, int)
void setVolume(int wid, int sid, int lv, int rv)
char * prepareBuffer(int &size)
Q_CORE_EXPORT void qDebug(const char *,...)
static void setPlayPriorityOnly(bool p)
virtual bool finished() const =0
int getSample(int off, int bps)
virtual ~QWSSoundServerProvider()
void append(const T &t)
Inserts value at the end of the list.
void sendDeviceError(int, int, int)
static const int sound_fragment_size
void sendClientMessage(QString msg)
#define QT_BEGIN_NAMESPACE
This macro expands to.
#define QT_QWS_SOUND_STEREO
static QIntfbScreen * connected
QList< QWSSoundServerProvider * > inactive
int add(int *mixl, int *mixr, int count)
void truncate(int pos)
Truncates the string at the given position index.
void setSilent(bool enabled)
QString left(int n) const Q_REQUIRED_RESULT
Returns a substring that contains the n leftmost characters of the string.
static bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
Creates a connection of the given type from the signal in the sender object to the method in the rece...
virtual int readySamples(int)=0
void playPriorityOnly(bool p)
void pauseFile(int wid, int sid)
const T & at(int i) const
Returns the item at index position i in the list.
The QStringList class provides a list of strings.
QList< PresetVolume > volumes
static int toInt(const QByteArray &str)
Q_CORE_EXPORT void qWarning(const char *,...)
int timerId() const
Returns the unique timer identifier, which is the same identifier as returned from QObject::startTime...
static const int runinLength
static const char * data(const QByteArray &arr)
int indexOf(QChar c, int from=0, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
QWSSoundServerBucket(int d, int wid, int sid)
QByteArray toLatin1() const Q_REQUIRED_RESULT
Returns a Latin-1 representation of the string as a QByteArray.
static int getNumTok(QString &in)
The QList::iterator class provides an STL-style non-const iterator for QList and QQueue.
int length() const
Same as size().
QString mid(int position, int n=-1) const Q_REQUIRED_RESULT
Returns a string that contains n characters of this string, starting at the specified position index...
static QAuServer & server()
void playPriorityOnly(bool)
The QTimerEvent class contains parameters that describe a timer event.
int openFile(int wid, int sid, const QString &filename)
QList< QWSSoundServerProvider * > active
void play(int, int, const QString &)
QObject * parent() const
Returns a pointer to the parent object.
bool singleShot
This static function calls a slot after a given time interval.
void setVolume(int, int, int, int)
int size() const
Returns the number of items in the list.
void sendSoundCompleted(int, int)
QList< CompletedInfo > completed
int qstrncmp(const char *str1, const char *str2, uint len)
QWSSoundServerSocket * server
static const int maxVolume
void stopFile(int wid, int sid)
QWSSoundServerProvider(int w, int s)
void setMute(int wid, int sid, bool m)
Q_CORE_EXPORT QTextStream & flush(QTextStream &s)
#define QT_QWS_SOUND_16BIT
static QByteArray encodeName(const QString &fileName)
By default, this function converts fileName to the local 8-bit encoding determined by the user's loca...
QStringList split(const QString &sep, SplitBehavior behavior=KeepEmptyParts, Qt::CaseSensitivity cs=Qt::CaseSensitive) const Q_REQUIRED_RESULT
Splits the string into substrings wherever sep occurs, and returns the list of those strings...
bool equal(int wid, int sid)
#define QT_VFB_SOUND_PIPE(DISPLAY)
The QFileInfo class provides system-independent file information.
Q_CORE_EXPORT QTextStream & left(QTextStream &s)
#define Q_UNUSED(x)
Indicates to the compiler that the parameter with the specified name is not used in the body of a fun...
Q_OUTOFLINE_TEMPLATE void qDeleteAll(ForwardIterator begin, ForwardIterator end)
T qToLittleEndian(T source)
void deleteLater()
Schedules this object for deletion.
The QLatin1Char class provides an 8-bit ASCII/Latin-1 character.
static const int sound_buffer_size
void playRawFile(int wid, int sid, const QString &filename, int freq, int channels, int bitspersample, int flags)
The QList class is a template class that provides lists.