@@ -64,126 +64,110 @@ static unsigned __stdcall ptt_thread ( void *arg );
64
64
65
65
HANDLE start_ptt_thread (struct audio_s * pa , int ch )
66
66
{
67
- save_audio_config_p = pa ;
67
+ save_audio_config_p = pa ;
68
68
69
- return (HANDLE )_beginthreadex (NULL , 0 , ptt_thread , (void * )(long )ch , 0 , NULL );
69
+ return (HANDLE )_beginthreadex (NULL , 0 , ptt_thread , (void * )(long )ch , 0 , NULL );
70
70
}
71
71
72
72
unsigned __stdcall ptt_thread (void * arg )
73
73
{
74
- WAVEFORMATEX wf ;
75
- HWAVEOUT hWaveOut ;
76
- int ch = (int )(long )arg ; // channel number.
77
- int channel = save_audio_config_p -> achan [ch ].octrl [OCTYPE_PTT ].ptt_channel ;
78
- int freq = save_audio_config_p -> achan [channel ].octrl [OCTYPE_PTT ].ptt_frequency ;
79
- int a = ACHAN2ADEV ( channel );
80
- int err ;
81
-
82
- if ( save_audio_config_p -> adev [a ].defined ) {
83
- wf .wFormatTag = WAVE_FORMAT_PCM ;
84
- wf .nChannels = save_audio_config_p -> adev [a ].num_channels ;
85
- wf .nSamplesPerSec = save_audio_config_p -> adev [a ].samples_per_sec ;
86
- wf .wBitsPerSample = save_audio_config_p -> adev [a ].bits_per_sample ;
87
- wf .nBlockAlign = ( wf .wBitsPerSample / 8 ) * wf .nChannels ;
88
- wf .nAvgBytesPerSec = wf .nBlockAlign * wf .nSamplesPerSec ;
89
- wf .cbSize = 0 ;
90
-
91
- /*
92
- * Open the audio output device.
93
- * Soundcard is only possibility at this time.
94
- */
95
-
96
- err = waveOutOpen ( & hWaveOut , atoi ( save_audio_config_p -> adev [a ].adevice_out ), & wf , (DWORD_PTR )NULL , 0 , CALLBACK_NULL );
97
- if ( err == MMSYSERR_NOERROR ) {
98
- WAVEHDR waveHeader ;
99
- short * pnData ;
100
- short sample ;
101
- int nSamples = save_audio_config_p -> adev [a ].samples_per_sec / freq ;
102
- int i ;
103
-
104
- waveHeader .dwBufferLength = save_audio_config_p -> adev [a ].num_channels * nSamples * sizeof ( short );
105
- waveHeader .lpData = malloc ( waveHeader .dwBufferLength );
106
- waveHeader .dwUser = 0 ;
107
- waveHeader .dwFlags = WHDR_BEGINLOOP | WHDR_ENDLOOP ;
108
- waveHeader .dwLoops = 0xFFFF ;
109
-
110
- pnData = (short * )waveHeader .lpData ;
111
-
112
- if ( save_audio_config_p -> adev [a ].num_channels == 1 ) {
113
- for ( i = 0 ; i < nSamples ; i ++ ) {
114
- sample = (short )( (double )SHRT_MAX * sin ( ( (double )i / (double )nSamples ) * 2.0 * M_PI ) );
115
- pnData [i ] = sample ;
116
- }
117
- }
118
- else {
119
- for ( i = 0 ; i < nSamples ; i ++ ) {
120
- sample = (short )( (double )SHRT_MAX * sin ( ( (double )i / (double )nSamples ) * 2.0 * M_PI ) );
121
- if ( channel == ADEVFIRSTCHAN ( a ) ) {
122
-
123
- // Stereo, left channel.
124
-
125
- pnData [i * 2 + 0 ] = sample ;
126
- pnData [i * 2 + 1 ] = 0 ;
127
- }
128
- else {
129
-
130
- // Stereo, right channel.
131
-
132
- pnData [i * 2 + 0 ] = 0 ;
133
- pnData [i * 2 + 1 ] = sample ;
134
- }
135
- }
136
- }
137
-
138
- err = waveOutPrepareHeader ( hWaveOut , & waveHeader , sizeof ( WAVEHDR ) );
139
- if ( err == MMSYSERR_NOERROR ) {
140
- HANDLE handles [3 ];
141
- DWORD dwWait ;
142
-
143
- handles [0 ] = save_audio_config_p -> achan [ch ].octrl [OCTYPE_PTT ].ptt_start ;
144
- handles [1 ] = save_audio_config_p -> achan [ch ].octrl [OCTYPE_PTT ].ptt_stop ;
145
- handles [2 ] = save_audio_config_p -> achan [ch ].octrl [OCTYPE_PTT ].ptt_close ;
146
-
147
- while ( 1 )
148
- {
149
- dwWait = WaitForMultipleObjects ( 3 , handles , FALSE, INFINITE );
150
-
151
- if ( dwWait == WAIT_OBJECT_0 + 0 )
152
- {
153
- //
154
- // ptt_set on
155
- //
156
-
157
- waveOutWrite ( hWaveOut , & waveHeader , sizeof ( WAVEHDR ) );
158
- }
159
- else if ( dwWait == WAIT_OBJECT_0 + 1 )
160
- {
161
- //
162
- // ptt_set off
163
- //
164
-
165
- waveOutReset ( hWaveOut );
166
- }
167
- else if ( dwWait == WAIT_OBJECT_0 + 2 )
168
- {
169
- //
170
- // close
171
- //
172
-
173
- waveOutReset ( hWaveOut );
174
- waveOutUnprepareHeader ( hWaveOut , & waveHeader , sizeof ( WAVEHDR ) );
175
-
176
- break ;
177
- }
178
- }
179
- }
180
-
181
- waveOutClose ( hWaveOut );
182
-
183
- free ( waveHeader .lpData );
74
+ WAVEFORMATEX wf ;
75
+ HWAVEOUT hWaveOut ;
76
+ int ch = (int )(long )arg ; // channel number.
77
+ int channel = save_audio_config_p -> achan [ch ].octrl [OCTYPE_PTT ].ptt_channel ;
78
+ int freq = save_audio_config_p -> achan [channel ].octrl [OCTYPE_PTT ].ptt_frequency ;
79
+ int a = ACHAN2ADEV ( channel );
80
+ int err ;
81
+
82
+ if (save_audio_config_p -> adev [a ].defined ) {
83
+ wf .wFormatTag = WAVE_FORMAT_PCM ;
84
+ wf .nChannels = save_audio_config_p -> adev [a ].num_channels ;
85
+ wf .nSamplesPerSec = save_audio_config_p -> adev [a ].samples_per_sec ;
86
+ wf .wBitsPerSample = save_audio_config_p -> adev [a ].bits_per_sample ;
87
+ wf .nBlockAlign = ( wf .wBitsPerSample / 8 ) * wf .nChannels ;
88
+ wf .nAvgBytesPerSec = wf .nBlockAlign * wf .nSamplesPerSec ;
89
+ wf .cbSize = 0 ;
90
+
91
+ /*
92
+ * Open the audio output device.
93
+ * Soundcard is only possibility at this time.
94
+ */
95
+
96
+ err = waveOutOpen ( & hWaveOut , atoi ( save_audio_config_p -> adev [a ].adevice_out ), & wf , (DWORD_PTR )NULL , 0 , CALLBACK_NULL );
97
+ if (err == MMSYSERR_NOERROR ) {
98
+ WAVEHDR waveHeader ;
99
+ short * pnData ;
100
+ short sample ;
101
+ int nSamples = save_audio_config_p -> adev [a ].samples_per_sec / freq ;
102
+ int i ;
103
+ int j ;
104
+
105
+ waveHeader .dwBufferLength = save_audio_config_p -> adev [a ].num_channels * nSamples * sizeof ( short );
106
+ waveHeader .lpData = malloc ( waveHeader .dwBufferLength );
107
+ waveHeader .dwUser = 0 ;
108
+ waveHeader .dwFlags = WHDR_BEGINLOOP | WHDR_ENDLOOP ;
109
+ waveHeader .dwLoops = 0xFFFF ;
110
+
111
+ pnData = (short * )waveHeader .lpData ;
112
+
113
+ for (i = 0 ; i < nSamples ; i ++ ) {
114
+ sample = (short )( (double )SHRT_MAX * sin ( ( (double )i / (double )nSamples ) * 2.0 * M_PI ) );
115
+
116
+ for (j = 0 ; j < save_audio_config_p -> adev [a ].num_channels ; j ++ ) {
117
+ if (channel == ADEVFIRSTCHAN ( a ) + j ) {
118
+ pnData [i * save_audio_config_p -> adev [a ].num_channels + j ] = sample ;
119
+ } else {
120
+ pnData [i * save_audio_config_p -> adev [a ].num_channels + j ] = 0 ;
121
+ }
184
122
}
123
+ }
124
+
125
+ err = waveOutPrepareHeader (hWaveOut , & waveHeader , sizeof ( WAVEHDR ));
126
+ if (err == MMSYSERR_NOERROR ) {
127
+ HANDLE handles [3 ];
128
+ DWORD dwWait ;
129
+
130
+ handles [0 ] = save_audio_config_p -> achan [ch ].octrl [OCTYPE_PTT ].ptt_start ;
131
+ handles [1 ] = save_audio_config_p -> achan [ch ].octrl [OCTYPE_PTT ].ptt_stop ;
132
+ handles [2 ] = save_audio_config_p -> achan [ch ].octrl [OCTYPE_PTT ].ptt_close ;
133
+
134
+ while (1 )
135
+ {
136
+ dwWait = WaitForMultipleObjects (3 , handles , FALSE, INFINITE );
137
+
138
+ if (dwWait == WAIT_OBJECT_0 + 0 ) {
139
+ //
140
+ // ptt_set on
141
+ //
142
+
143
+ waveOutWrite ( hWaveOut , & waveHeader , sizeof ( WAVEHDR ) );
144
+ }
145
+ else if (dwWait == WAIT_OBJECT_0 + 1 ) {
146
+ //
147
+ // ptt_set off
148
+ //
149
+
150
+ waveOutReset ( hWaveOut );
151
+ }
152
+ else if ( dwWait == WAIT_OBJECT_0 + 2 ) {
153
+ //
154
+ // close
155
+ //
156
+
157
+ waveOutReset ( hWaveOut );
158
+ waveOutUnprepareHeader ( hWaveOut , & waveHeader , sizeof ( WAVEHDR ) );
159
+
160
+ break ;
161
+ }
162
+ }
163
+ }
164
+
165
+ waveOutClose ( hWaveOut );
166
+
167
+ free ( waveHeader .lpData );
185
168
}
169
+ }
186
170
187
- return 0 ;
171
+ return 0 ;
188
172
}
189
173
#endif
0 commit comments