Changeset 55 for psi/trunk/src/common.cpp
- Timestamp:
- Sep 21, 2006, 12:43:03 AM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
psi/trunk/src/common.cpp
r54 r55 1599 1599 lock.unlock(); 1600 1600 } 1601 void add(ulong freq, ulong dur) {1601 void beginSequence() { 1602 1602 lock.lock(); 1603 queue.clear(); // stop the previous sequence 1604 } 1605 void addNote(ulong freq, ulong dur) { 1603 1606 queue.push_back(Beep(freq, dur)); 1607 } 1608 void endSequence() { 1604 1609 lock.unlock(); 1605 1610 if (!sem.available()) … … 1622 1627 }; 1623 1628 QMutex lock; 1624 QSemaphore sem; 1629 QSemaphore sem; // not QWaitCond cause we need level-triggered semantics 1625 1630 QValueList<Beep> queue; 1626 1631 bool terminate; … … 1640 1645 void soundPlay(const QString &str) 1641 1646 { 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") */) { 1653 1650 if (beepThread == 0) { 1654 1651 beepThread = new BeepThread(); … … 1658 1655 } 1659 1656 } 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 } 1662 1683 return; 1663 1684 }
Note:
See TracChangeset
for help on using the changeset viewer.