Ignore:
Timestamp:
Sep 21, 2006, 12:43:03 AM (19 years ago)
Author:
dmik
Message:

Psi: General: Changed the !beep format to specify sequences of beeps: !beep[:freq[,dur]]...

File:
1 edited

Legend:

Unmodified
Added
Removed
  • psi/trunk/src/common.cpp

    r54 r55  
    15991599                lock.unlock();
    16001600        }
    1601         void add(ulong freq, ulong dur) {
     1601        void beginSequence() {
    16021602                lock.lock();
     1603                queue.clear(); // stop the previous sequence
     1604        }
     1605        void addNote(ulong freq, ulong dur) {
    16031606                queue.push_back(Beep(freq, dur));
     1607        }
     1608        void endSequence() {
    16041609                lock.unlock();
    16051610                if (!sem.available())
     
    16221627        };
    16231628        QMutex lock;
    1624         QSemaphore sem;
     1629        QSemaphore sem; // not QWaitCond cause we need level-triggered semantics
    16251630        QValueList<Beep> queue;
    16261631        bool terminate;
     
    16401645void soundPlay(const QString &str)
    16411646{
    1642         if(str.startsWith("!beep")) {
    1643                 QStringList list = QStringList::split(':',str);
    1644                 if (list[0].length() == 5 /* strlen("!beep") */) {
    1645                         ulong freq = 0, dur = 0;
    1646                         if (list.count() == 3) {
    1647                                 freq = list[1].toULong();
    1648                                 dur = list[2].toULong();
    1649                                 if (freq < 0x25 || freq > 0x7FFF ||
    1650                                         dur == 0 || dur > 3000 /* 3s is the reasonable maximum */)
    1651                                         freq = dur = 0;
    1652                         }
     1647        if (str.startsWith("!beep")) {
     1648                QStringList seq = QStringList::split(':',str);
     1649                if (seq[0].length() == 5 /* strlen("!beep") */) {
    16531650                        if (beepThread == 0) {
    16541651                                beepThread = new BeepThread();
     
    16581655                                }
    16591656                        }
    1660                         if (beepThread)
    1661                                 beepThread->add(freq, dur);
     1657                        Q_ASSERT(beepThread);
     1658                        if (beepThread) {
     1659                                beepThread->beginSequence();
     1660#if defined(Q_WS_WIN) || defined(Q_WS_PM)
     1661                                ulong lastDur = 100;
     1662                                size_t i = 1;
     1663                                for (; i < seq.count(); ++i) {
     1664                                        QStringList note = QStringList::split(',',seq[i]);
     1665                                        if (note.count() < 1) break;
     1666                                        ulong freq = note[0].toULong();
     1667                                        if (freq < 0x25 || freq > 0x7FFF) break;
     1668                                        ulong dur = lastDur;
     1669                                        if (note.count() > 2) break;
     1670                                        if (note.count() == 2) {
     1671                                                dur = note[1].toULong();
     1672                                                // 3s is the reasonable maximum for the duration
     1673                                                if (dur == 0 || dur > 3000) break;
     1674                                                lastDur = dur;
     1675                                        }
     1676                                        beepThread->addNote(freq, dur);
     1677                                }
     1678                                if (i == 1) // didn't find a single note
     1679#endif                         
     1680                                        beepThread->addNote(0, 0);
     1681                                beepThread->endSequence();
     1682                        }
    16621683                        return;
    16631684                }
Note: See TracChangeset for help on using the changeset viewer.