Subversion Repositories tpanel

Rev

Rev 473 | Rev 477 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 473 Rev 474
Line 33... Line 33...
33
#       include <QPermissions>
33
#       include <QPermissions>
34
#   endif   // QT_VERSION_CHECK(6, 6, 0)
34
#   endif   // QT_VERSION_CHECK(6, 6, 0)
35
#endif  // defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
35
#endif  // defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
36
 
36
 
37
#include "tqintercom.h"
37
#include "tqintercom.h"
-
 
38
#include "tresources.h"
38
#include "tconfig.h"
39
#include "tconfig.h"
39
#include "terror.h"
40
#include "terror.h"
40
 
41
 
41
#define PACKET_SIZE     172
42
#define PACKET_SIZE     172
-
 
43
#define DATA_SIZE       160
-
 
44
#define HEADER_SIZE     12
42
 
45
 
43
using std::string;
46
using std::string;
44
using std::min;
47
using std::min;
45
 
48
 
46
TQIntercom::TQIntercom(QObject *parent)
49
TQIntercom::TQIntercom(QObject *parent)
Line 333... Line 336...
333
                if (mUdpTalker->state() != QUdpSocket::ConnectedState || io == nullptr)
336
                if (mUdpTalker->state() != QUdpSocket::ConnectedState || io == nullptr)
334
                    return;
337
                    return;
335
 
338
 
336
                int len = io->bytesAvailable();
339
                int len = io->bytesAvailable();
337
                MSG_DEBUG(len << " bytes available");
340
                MSG_DEBUG(len << " bytes available");
338
                int chunks = len / PACKET_SIZE;
341
                int chunks = len / DATA_SIZE;
339
 
342
 
340
                if (chunks > 0)
343
                if (chunks > 0)
341
                {
344
                {
-
 
345
                    mMicOpen = true;
-
 
346
 
342
                    for (int i = 0; i < chunks; ++i)
347
                    for (int i = 0; i < chunks; ++i)
343
                    {
348
                    {
-
 
349
                        QByteArray buffer(DATA_SIZE, 0);
344
                        QByteArray buffer(PACKET_SIZE, 0);
350
                        QByteArray wbuf(PACKET_SIZE, 0);
345
                        len = io->read(buffer.data(), PACKET_SIZE);
351
                        len = io->read(buffer.data(), DATA_SIZE);
346
 
352
 
347
                        if (len > 0 && mTalkConnected)
353
                        if (len > 0 && mTalkConnected)
348
                        {
354
                        {
-
 
355
                            len = getNextBlock(&wbuf, buffer);
349
                            MSG_DEBUG("Writing bytes: " << len);
356
                            MSG_DEBUG("Writing bytes: " << len);
350
                            mUdpTalker->write(buffer.data(), len);
357
                            mUdpTalker->write(wbuf.data(), len);
-
 
358
                            TError::logHex(wbuf.data(), len);
351
                        }
359
                        }
352
                    }
360
                    }
353
                }
361
                }
354
                else if (len > 0)
362
                else if (len == 0)
-
 
363
                {
-
 
364
                    if (!mMicOpen)
-
 
365
                    {
-
 
366
                        QByteArray buffer(DATA_SIZE, uLawEncode(0));
-
 
367
                        QByteArray wbuf(PACKET_SIZE, 0);
-
 
368
                        len = getNextBlock(&wbuf, buffer);
-
 
369
                        MSG_DEBUG("Writing bytes: " << len);
-
 
370
                        mUdpTalker->write(wbuf.data(), len);
-
 
371
                        TError::logHex(wbuf.data(), len);
-
 
372
                    }
-
 
373
                }
-
 
374
                else
355
                {
375
                {
-
 
376
                    mMicOpen = true;
356
                    QByteArray buffer(len, 0);
377
                    QByteArray buffer(len, 0);
-
 
378
                    QByteArray wbuf(HEADER_SIZE + len, 0);
357
 
379
 
358
                    if (mTalkConnected)
380
                    if (mTalkConnected)
359
                    {
381
                    {
-
 
382
                        len = getNextBlock(&wbuf, buffer);
360
                        MSG_DEBUG("Writing bytes: " << len);
383
                        MSG_DEBUG("Writing bytes: " << len);
361
                        mUdpTalker->write(buffer.data(), len);
384
                        mUdpTalker->write(wbuf.data(), len);
362
                    }
385
                    }
363
                }
386
                }
364
            });
387
            });
365
 
388
 
366
            mPushTimer->start(10);
389
            mPushTimer->start(10);
Line 402... Line 425...
402
            mPushTimer->stop();
425
            mPushTimer->stop();
403
            mPushTimer->disconnect();
426
            mPushTimer->disconnect();
404
        }
427
        }
405
 
428
 
406
        if (mMicDevice)
429
        if (mMicDevice)
-
 
430
        {
407
            mMicDevice->stop();
431
            mMicDevice->stop();
-
 
432
            mMicOpen = false;
-
 
433
        }
408
 
434
 
409
        if (mMicrophone)
435
        if (mMicrophone)
410
        {
436
        {
411
            mMicrophone->stop();
437
            mMicrophone->stop();
412
            delete mMicrophone;
438
            delete mMicrophone;
Line 510... Line 536...
510
 
536
 
511
        if (mRemote)
537
        if (mRemote)
512
        {
538
        {
513
            for (qsizetype i = 0; i < data.size(); ++i)
539
            for (qsizetype i = 0; i < data.size(); ++i)
514
            {
540
            {
-
 
541
                if (i < HEADER_SIZE)
-
 
542
                    continue;
-
 
543
 
515
                uint16_t word = uLawDecode(data[i]);
544
                uint16_t word = uLawDecode(data[i]);
516
                uint8_t hbyte = word >> 8;
545
                uint8_t hbyte = word >> 8;
517
                uint8_t lbyte = word;
546
                uint8_t lbyte = word;
518
                mReadBuffer.append(hbyte);
547
                mReadBuffer.append(hbyte);
519
                mReadBuffer.append(lbyte);
548
                mReadBuffer.append(lbyte);
Line 685... Line 714...
685
 
714
 
686
    lsb = (number >> (position - 4)) & 0x0f;
715
    lsb = (number >> (position - 4)) & 0x0f;
687
    return (~(sign | ((position - 5) << 4) | lsb));
716
    return (~(sign | ((position - 5) << 4) | lsb));
688
}
717
}
689
 
718
 
-
 
719
long TQIntercom::getNextBlock(QByteArray* target, const QByteArray& data)
-
 
720
{
-
 
721
    DECL_TRACER("TQIntercom::getNextBlock(QByteArray* target, const QByteArray& data)");
-
 
722
 
-
 
723
    if (!target)
-
 
724
        return 0;
-
 
725
 
-
 
726
    long size = qMin(data.size(), DATA_SIZE);
-
 
727
    mHeader.counter++;
-
 
728
    mHeader.position += size;
-
 
729
    unsigned char bytes[10];
-
 
730
 
-
 
731
    if (target)
-
 
732
    {
-
 
733
        target->clear();
-
 
734
 
-
 
735
        uint16ToBytes(mHeader.ident, bytes);
-
 
736
        target->append(reinterpret_cast<char *>(bytes), 2);
-
 
737
        uint16ToBytes(mHeader.counter, bytes);
-
 
738
        target->append(reinterpret_cast<char *>(bytes), 2);
-
 
739
        uint32ToBytes(mHeader.position, bytes);
-
 
740
        target->append(reinterpret_cast<char *>(bytes), 4);
-
 
741
        uint16ToBytes(mHeader.unk1, bytes);
-
 
742
        target->append(reinterpret_cast<char *>(bytes), 2);
-
 
743
        uint16ToBytes(mHeader.unk2, bytes);
-
 
744
        target->append(reinterpret_cast<char *>(bytes), 2);
-
 
745
        target->append(data.right(size));
-
 
746
    }
-
 
747
 
-
 
748
    return size + HEADER_SIZE;
-
 
749
}
-
 
750
 
690
/*******************************************************************************
751
/*******************************************************************************
691
 * Methods of class _audioWrite start here
752
 * Methods of class _audioWrite start here
692
 ******************************************************************************/
753
 ******************************************************************************/
693
 
754
 
694
TMicrophone::TMicrophone()
755
TMicrophone::TMicrophone()
Line 731... Line 792...
731
    if (!mBuffer.isEmpty())
792
    if (!mBuffer.isEmpty())
732
    {
793
    {
733
        qint64 posBuffer = 0;
794
        qint64 posBuffer = 0;
734
        qint64 posData = 0;
795
        qint64 posData = 0;
735
        qint64 size = qMin(len, mBuffer.size());
796
        qint64 size = qMin(len, mBuffer.size());
-
 
797
        qint16 hbyte, lbyte, word;
-
 
798
        bool bigEndian = isBigEndian();
736
 
799
 
737
        while (posData < size)
800
        while (posData < size)
738
        {
801
        {
739
            if (posBuffer >= mBuffer.size())
802
            if (posBuffer >= mBuffer.size())
740
                break;
803
                break;
741
 
804
 
742
            qint16 hbyte = mBuffer[posBuffer];
805
            hbyte = mBuffer[posBuffer];
743
            posBuffer++;
806
            posBuffer++;
744
            qint16 lbyte = mBuffer[posBuffer];
807
            lbyte = mBuffer[posBuffer];
745
            posBuffer++;
808
            posBuffer++;
-
 
809
 
-
 
810
            if (bigEndian)
746
            qint16 word = ((hbyte << 8) & 0xff00) | lbyte;
811
                word = ((hbyte << 8) & 0xff00) | lbyte;
-
 
812
            else
-
 
813
                word = ((lbyte << 8) & 0xff00) | hbyte;
-
 
814
 
747
            *(data+posData) = uLawEncode(word);
815
            *(data+posData) = uLawEncode(word);
748
            posData++;
816
            posData++;
749
        }
817
        }
750
 
818
 
751
        mBuffer.remove(0, posBuffer);
819
        mBuffer.remove(0, posBuffer);
Line 797... Line 865...
797
 
865
 
798
    for (; ((number & mask) != mask && position >= 5); mask >>= 1, position--)
866
    for (; ((number & mask) != mask && position >= 5); mask >>= 1, position--)
799
        ;
867
        ;
800
 
868
 
801
    lsb = (number >> (position - 4)) & 0x0f;
869
    lsb = (number >> (position - 4)) & 0x0f;
802
    return (~(sign | ((position - 5) << 4) | lsb));
870
    return (~(sign | (((position - 5) << 4) & 0xf0) | lsb));
803
}
-
 
804
 
-
 
805
int16_t TMicrophone::uLawDecode(int8_t number)
-
 
806
{
-
 
807
    DECL_TRACER("_audioIO::uLawDecode(int8_t number)");
-
 
808
 
-
 
809
    const uint16_t MULAW_BIAS = 33;
-
 
810
    uint8_t sign = 0, position = 0;
-
 
811
    int16_t decoded = 0;
-
 
812
    number = ~number;
-
 
813
 
-
 
814
    if (number & 0x80)
-
 
815
    {
-
 
816
        number &= ~(1 << 7);
-
 
817
        sign = -1;
-
 
818
    }
-
 
819
 
-
 
820
    position = ((number & 0xF0) >> 4) + 5;
-
 
821
    decoded = ((1 << position) | ((number & 0x0F) << (position - 4)) | (1 << (position - 5))) - MULAW_BIAS;
-
 
822
    return (sign == 0) ? (decoded) : (-(decoded));
-
 
823
}
871
}