mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-11-18 10:01:57 -05:00
581691befb
The code was starting streams linked to closed devices which may be causing issues on the Mac version. I have refactored to ensure that devices are always opened before related audio streams are started. Made .h C++ headers emacs friendly. Removed some code in the MainWindow contructor that read the log file but failed to check if the file exists and didn't do anything with the data anyway. git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@3977 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
99 lines
1.9 KiB
C++
99 lines
1.9 KiB
C++
#ifndef AUDIODEVICE_HPP__
|
|
#define AUDIODEVICE_HPP__
|
|
|
|
#include <QIODevice>
|
|
|
|
class QDataStream;
|
|
|
|
//
|
|
// abstract base class for audio devices
|
|
//
|
|
class AudioDevice : public QIODevice
|
|
{
|
|
public:
|
|
enum Channel {Mono, Left, Right, Both}; // these are mapped to combobox index so don't change
|
|
|
|
static char const * toString (Channel c)
|
|
{
|
|
return Mono == c ? "Mono" : Left == c ? "Left" : Right == c ? "Right" : "Both";
|
|
}
|
|
|
|
static Channel fromString (QString const& str)
|
|
{
|
|
QString s (str.toCaseFolded ().trimmed ().toLatin1 ());
|
|
return "both" == s ? Both : "right" == s ? Right : "left" == s ? Left : Mono;
|
|
}
|
|
|
|
bool initialize (OpenMode mode, Channel channel);
|
|
|
|
bool isSequential () const {return true;}
|
|
|
|
size_t bytesPerFrame () const {return sizeof (qint16) * (Mono == m_channel ? 1 : 2);}
|
|
|
|
Channel channel () const {return m_channel;}
|
|
|
|
protected:
|
|
AudioDevice (QObject * parent = 0)
|
|
: QIODevice (parent)
|
|
{
|
|
}
|
|
|
|
void store (char const * source, size_t numFrames, qint16 * dest)
|
|
{
|
|
qint16 const * begin (reinterpret_cast<qint16 const *> (source));
|
|
for ( qint16 const * i = begin; i != begin + numFrames * (bytesPerFrame () / sizeof (qint16)); i += bytesPerFrame () / sizeof (qint16))
|
|
{
|
|
switch (m_channel)
|
|
{
|
|
case Mono:
|
|
*dest++ = *i;
|
|
break;
|
|
|
|
case Right:
|
|
*dest++ = *(i + 1);
|
|
break;
|
|
|
|
case Both: // should be able to happen but if it
|
|
// does we'll take left
|
|
Q_ASSERT (Both == m_channel);
|
|
case Left:
|
|
*dest++ = *i;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
qint16 * load (qint16 const sample, qint16 * dest)
|
|
{
|
|
switch (m_channel)
|
|
{
|
|
case Mono:
|
|
*dest++ = sample;
|
|
break;
|
|
|
|
case Left:
|
|
*dest++ = sample;
|
|
*dest++ = 0;
|
|
break;
|
|
|
|
case Right:
|
|
*dest++ = 0;
|
|
*dest++ = sample;
|
|
break;
|
|
|
|
case Both:
|
|
*dest++ = sample;
|
|
*dest++ = sample;
|
|
break;
|
|
}
|
|
return dest;
|
|
}
|
|
|
|
private:
|
|
Channel m_channel;
|
|
};
|
|
|
|
Q_DECLARE_METATYPE (AudioDevice::Channel);
|
|
|
|
#endif
|