@@ -122,6 +122,8 @@ internal class AudioRecordManager(private val context: Context)
122122 @SuppressLint(" MissingPermission" )
123123 fun tryInitializeWithSourceAndRate (audioSource : Int , sampleRate : Int ): AudioRecordInitResult
124124 {
125+ var testAudioRecord: AudioRecord ? = null
126+
125127 return try
126128 {
127129 // Check for RECORD_AUDIO permission first
@@ -132,6 +134,7 @@ internal class AudioRecordManager(private val context: Context)
132134
133135 if (permissionCheck != PackageManager .PERMISSION_GRANTED )
134136 {
137+ Timber .e(" RECORD_AUDIO permission not granted!" )
135138 return AudioRecordInitResult .SourceFailed (
136139 audioSource = audioSource,
137140 errorMessage = " RECORD_AUDIO permission not granted"
@@ -140,46 +143,42 @@ internal class AudioRecordManager(private val context: Context)
140143
141144 // Calculate buffer size for this configuration
142145 val minBufferSize = AudioRecord .getMinBufferSize(sampleRate, CHANNEL_CONFIG , AUDIO_FORMAT )
146+ Timber .d(" getMinBufferSize for $sampleRate : $minBufferSize (ERROR=${ AudioRecord .ERROR } , ERROR_BAD_VALUE=${AudioRecord .ERROR_BAD_VALUE } )" )
143147
144148 if (minBufferSize == AudioRecord .ERROR_BAD_VALUE || minBufferSize == AudioRecord .ERROR )
145149 {
146150 return AudioRecordInitResult .SourceFailed (
147151 audioSource = audioSource,
148- errorMessage = " Invalid audio configuration for source $audioSource at ${sampleRate} Hz"
152+ errorMessage = " Invalid audio configuration for source $audioSource at ${sampleRate} Hz, minBufferSize= $minBufferSize "
149153 )
150154 }
151155
152156 // Use optimal buffer size
153157 val calculatedBufferSize = calculateOptimalBufferSize(minBufferSize)
154-
155- // Create AudioRecord instance - simple, no routing
156- val testAudioRecord = try {
157- AudioRecord (
158- audioSource,
159- sampleRate,
160- CHANNEL_CONFIG ,
161- AUDIO_FORMAT ,
162- calculatedBufferSize
163- )
164- }
165- catch (securityException: SecurityException )
166- {
167- return AudioRecordInitResult .SourceFailed (
168- audioSource = audioSource,
169- errorMessage = " SecurityException creating AudioRecord: ${securityException.message} " ,
170- cause = securityException
171- )
172- }
158+ Timber .d(" Creating AudioRecord: source=$audioSource , rate=$sampleRate , buffer=$calculatedBufferSize " )
159+
160+ // Create AudioRecord instance
161+ testAudioRecord = AudioRecord (
162+ audioSource,
163+ sampleRate,
164+ CHANNEL_CONFIG ,
165+ AUDIO_FORMAT ,
166+ calculatedBufferSize
167+ )
173168
174169 // Check if initialization was successful
175- if (testAudioRecord.state == AudioRecord .STATE_INITIALIZED )
170+ val state = testAudioRecord.state
171+ Timber .d(" AudioRecord created: state=$state (STATE_INITIALIZED=${AudioRecord .STATE_INITIALIZED } , STATE_UNINITIALIZED=${AudioRecord .STATE_UNINITIALIZED } )" )
172+
173+ if (state == AudioRecord .STATE_INITIALIZED )
176174 {
177175 // Success - store the AudioRecord and buffer size
178176 audioRecord = testAudioRecord
179177 bufferSize = calculatedBufferSize
178+ testAudioRecord = null // Don't release this one
180179
181180 val recordInfo = AudioRecordInfo (
182- state = testAudioRecord .state,
181+ state = audioRecord !! .state,
183182 audioSource = audioSource,
184183 sampleRate = sampleRate,
185184 channelConfig = CHANNEL_CONFIG ,
@@ -188,6 +187,8 @@ internal class AudioRecordManager(private val context: Context)
188187 minBufferSize = minBufferSize
189188 )
190189
190+ Timber .i(" ✅ SUCCESS: AudioRecord initialized with source=$audioSource , rate=${sampleRate} Hz" )
191+
191192 AudioRecordInitResult .Success (
192193 audioRecordInfo = recordInfo,
193194 workingAudioSource = audioSource
@@ -196,16 +197,23 @@ internal class AudioRecordManager(private val context: Context)
196197 else
197198 {
198199 // AudioRecord failed to initialize
200+ Timber .w(" ❌ FAILED: AudioRecord state=$state for source=$audioSource , rate=${sampleRate} Hz" )
199201 testAudioRecord.release()
202+ testAudioRecord = null
203+
200204 AudioRecordInitResult .SourceFailed (
201205 audioSource = audioSource,
202- errorMessage = " AudioRecord state: ${testAudioRecord. state} at ${sampleRate} Hz"
206+ errorMessage = " AudioRecord state: $state at ${sampleRate} Hz"
203207 )
204208 }
205209
206210 }
207211 catch (exception: Exception )
208212 {
213+ Timber .e(exception, " 💥 EXCEPTION creating AudioRecord: source=$audioSource , rate=${sampleRate} Hz" )
214+
215+ testAudioRecord?.release()
216+
209217 AudioRecordInitResult .SourceFailed (
210218 audioSource = audioSource,
211219 errorMessage = " Exception at ${sampleRate} Hz: ${exception.message} " ,
0 commit comments