39 ** |
39 ** |
40 ****************************************************************************/ |
40 ****************************************************************************/ |
41 |
41 |
42 #include <math.h> |
42 #include <math.h> |
43 |
43 |
44 #define BUFFER_SIZE 32768 |
|
45 |
|
46 #include <QObject> |
44 #include <QObject> |
47 #include <QMainWindow> |
45 #include <QMainWindow> |
48 #include <QIODevice> |
46 #include <QIODevice> |
49 #include <QTimer> |
47 #include <QTimer> |
50 #include <QPushButton> |
48 #include <QPushButton> |
51 #include <QComboBox> |
49 #include <QComboBox> |
|
50 #include <QByteArray> |
52 |
51 |
53 #include <QAudioOutput> |
52 #include <QAudioOutput> |
54 |
53 |
55 class Generator : public QIODevice |
54 class Generator : public QIODevice |
56 { |
55 { |
57 Q_OBJECT |
56 Q_OBJECT |
58 public: |
57 public: |
59 Generator(QObject *parent); |
58 Generator(const QAudioFormat &format, qint64 durationUs, int frequency, QObject *parent); |
60 ~Generator(); |
59 ~Generator(); |
61 |
60 |
62 void start(); |
61 void start(); |
63 void stop(); |
62 void stop(); |
64 |
63 |
65 char *t; |
|
66 int len; |
|
67 int pos; |
|
68 int total; |
|
69 char *buffer; |
|
70 bool finished; |
|
71 int chunk_size; |
|
72 |
|
73 qint64 readData(char *data, qint64 maxlen); |
64 qint64 readData(char *data, qint64 maxlen); |
74 qint64 writeData(const char *data, qint64 len); |
65 qint64 writeData(const char *data, qint64 len); |
|
66 qint64 bytesAvailable() const; |
75 |
67 |
76 private: |
68 private: |
77 int putShort(char *t, unsigned int value); |
69 void generateData(const QAudioFormat &format, qint64 durationUs, int frequency); |
78 int fillData(char *start, int frequency, int seconds); |
70 |
|
71 private: |
|
72 qint64 m_pos; |
|
73 QByteArray m_buffer; |
79 }; |
74 }; |
80 |
75 |
81 class AudioTest : public QMainWindow |
76 class AudioTest : public QMainWindow |
82 { |
77 { |
83 Q_OBJECT |
78 Q_OBJECT |
84 public: |
79 public: |
85 AudioTest(); |
80 AudioTest(); |
86 ~AudioTest(); |
81 ~AudioTest(); |
87 |
82 |
88 QAudioDeviceInfo device; |
83 private: |
89 Generator* gen; |
84 void initializeWindow(); |
90 QAudioOutput* audioOutput; |
85 void initializeAudio(); |
91 QIODevice* output; |
86 void createAudioOutput(); |
92 QTimer* timer; |
|
93 QAudioFormat settings; |
|
94 |
87 |
95 bool pullMode; |
88 private: |
96 char* buffer; |
89 QTimer* m_pullTimer; |
97 |
90 |
98 QPushButton* button; |
91 // Owned by layout |
99 QPushButton* button2; |
92 QPushButton* m_modeButton; |
100 QComboBox* deviceBox; |
93 QPushButton* m_suspendResumeButton; |
|
94 QComboBox* m_deviceBox; |
|
95 |
|
96 QAudioDeviceInfo m_device; |
|
97 Generator* m_generator; |
|
98 QAudioOutput* m_audioOutput; |
|
99 QIODevice* m_output; // not owned |
|
100 QAudioFormat m_format; |
|
101 |
|
102 bool m_pullMode; |
|
103 QByteArray m_buffer; |
|
104 |
|
105 static const QString PushModeLabel; |
|
106 static const QString PullModeLabel; |
|
107 static const QString SuspendLabel; |
|
108 static const QString ResumeLabel; |
101 |
109 |
102 private slots: |
110 private slots: |
103 void status(); |
111 void notified(); |
104 void writeMore(); |
112 void pullTimerExpired(); |
105 void toggle(); |
113 void toggleMode(); |
106 void togglePlay(); |
114 void toggleSuspendResume(); |
107 void state(QAudio::State s); |
115 void stateChanged(QAudio::State state); |
108 void deviceChanged(int idx); |
116 void deviceChanged(int index); |
109 }; |
117 }; |
110 |
118 |