My application uses AudioRecord to record streaming voice. On ANY
OTHER Android device it initializes properly and works great,
excluding Motorola Milestone, which force closes and the log shows:

01-17 14:08:41.124: DEBUG/AudioHardwareMot(1059):
AudioMgr:AudioHardwareMot::openInputStream enter
01-17 14:08:41.124: DEBUG/AudioHardwareMot(1059):
AudioMgr:AudioStreamInMot::set(0xaf00, 40000, 1, 10, 8000)
01-17 14:08:41.124: ERROR/AudioRecord(2190): AudioFlinger could not
create record track, status: -22
01-17 14:08:41.124: ERROR/AudioRecord-JNI(2190): Error creating
AudioRecord instance: initialization check failed.
01-17 14:08:41.124: ERROR/AudioRecord-Java(2190):
[ android.media.AudioRecord ] Error code -20 when initializing native
AudioRecord object.

Sometimes it happens, sometimes it doesn't, and looking into the
platform source code doesn't clarify it. It returns with BAD_VALUE
error code. The code in AudioFlinger.cpp that does that:

[CODE]sp<IAudioRecord> AudioFlinger::openRecord(
2890         pid_t pid,
2891         int input,
2892         uint32_t sampleRate,
2893         int format,
2894         int channelCount,
2895         int frameCount,
2896         uint32_t flags,
2897         status_t *status)
2898 {
2899     sp<RecordThread::RecordTrack> recordTrack;
2900     sp<RecordHandle> recordHandle;
2901     sp<Client> client;
2902     wp<Client> wclient;
2903     status_t lStatus;
2904     RecordThread *thread;
2905     size_t inFrameCount;
2906
2907     // check calling permissions
2908     if (!recordingAllowed()) {
2909         lStatus = PERMISSION_DENIED;
2910         goto Exit;
2911     }
2912
2913     // add client to list
2914     { // scope for mLock
2915         Mutex::Autolock _l(mLock);
2916         thread = checkRecordThread_l(input);
2917         if (thread == NULL) {
2918             lStatus = BAD_VALUE;
2919             goto Exit;
2920         }
2921
2922         wclient = mClients.valueFor(pid);
2923         if (wclient != NULL) {
2924             client = wclient.promote();
2925         } else {
2926             client = new Client(this, pid);
2927             mClients.add(pid, client);
2928         }
2929
2930         // create new record track. The record track uses one
track in mHardwareMixerThread by convention.
2931         recordTrack = new RecordThread::RecordTrack(thread,
client, sampleRate,
2932                                                    format,
channelCount, frameCount, flags);
2933     }
2934     if (recordTrack->getCblk() == NULL) {
2935         // remove local strong reference to Client before
deleting the RecordTrack so that the Client
2936         // destructor is called by the TrackBase destructor with
mLock held
2937         client.clear();
2938         recordTrack.clear();
2939         lStatus = NO_MEMORY;
2940         goto Exit;
2941     }
2942
2943     // return to handle to client
2944     recordHandle = new RecordHandle(recordTrack);
2945     lStatus = NO_ERROR;
2946
2947 Exit:
2948     if (status) {
2949         *status = lStatus;
2950     }
2951     return recordHandle;
2952 }[/CODE]

The code that initializes AudioRecord:

[CODE]record = new AudioRecord(MediaRecorder.AudioSource.MIC, 8000,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
                                        AudioFormat.ENCODING_PCM_16BIT, 
AudioRecord.getMinBufferSize
(8000,
                                                        
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT) * 4);[/CODE]

Again, it works fine on any other device, including Droid.

Thanks for any help!
-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to