Annotation of hatari/src/falcon/microphone.c, revision 1.1

1.1     ! root        1: /*
        !             2:   Hatari - microphone.c
        !             3:   microphone (jack connector) emulation (Falcon mode only)
        !             4: 
        !             5:   This file is distributed under the GNU Public License, version 2 or at
        !             6:   your option any later version. Read the file gpl.txt for details.
        !             7: 
        !             8:   This program uses the PortAudio Portable Audio Library.
        !             9:   For more information see: http://www.portaudio.com
        !            10:   Copyright (c) 1999-2000 Ross Bencina and Phil Burk
        !            11: */
        !            12: 
        !            13: #include "main.h"
        !            14: 
        !            15: #if HAVE_PORTAUDIO
        !            16: 
        !            17: #include <portaudio.h>
        !            18: #include "microphone.h"
        !            19: #include "crossbar.h"
        !            20: 
        !            21: 
        !            22: #define FRAMES_PER_BUFFER (64)
        !            23: 
        !            24: /* Static functions */
        !            25: static void Microphone_Error (void);
        !            26: static int Microphone_Terminate(void);
        !            27: 
        !            28: static int Microphone_Callback (const void *inputBuffer, void *outputBuffer,
        !            29:                            unsigned long framesPerBuffer,
        !            30:                            const PaStreamCallbackTimeInfo* timeInfo,
        !            31:                            PaStreamCallbackFlags statusFlags,
        !            32:                            void *userData);
        !            33: 
        !            34: /* Static datas */
        !            35: static PaStreamParameters micro_inputParameters;
        !            36: static PaStream *micro_stream;
        !            37: static PaError  micro_err;
        !            38: 
        !            39: static int   micro_sampleRate;
        !            40: static Sint16 micro_buffer_L[FRAMES_PER_BUFFER];       /* left buffer */
        !            41: static Sint16 micro_buffer_R[FRAMES_PER_BUFFER];       /* right buffer */
        !            42: 
        !            43: 
        !            44: /* This routine will be called by the PortAudio engine when audio is needed.
        !            45: ** It may be called at interrupt level on some machines so don't do anything
        !            46: ** that could mess up the system like calling malloc() or free().
        !            47: */
        !            48: static int Microphone_Callback (const void *inputBuffer, void *outputBuffer,
        !            49:                            unsigned long framesPerBuffer,
        !            50:                            const PaStreamCallbackTimeInfo* timeInfo,
        !            51:                            PaStreamCallbackFlags statusFlags,
        !            52:                            void *userData)
        !            53: {
        !            54:        unsigned int i;
        !            55:        const Sint16 *in = inputBuffer;
        !            56:        
        !            57:        Sint16 *out_L = (Sint16*)micro_buffer_L;
        !            58:        Sint16 *out_R = (Sint16*)micro_buffer_R;
        !            59: 
        !            60:        if (inputBuffer == NULL) {
        !            61:                memset(micro_buffer_L, 0, sizeof(micro_buffer_L));
        !            62:                memset(micro_buffer_R, 0, sizeof(micro_buffer_R));
        !            63:        }
        !            64:        else {
        !            65:                for (i=0; i<framesPerBuffer; i++) {
        !            66:                        *out_L ++ = *in++;      /* left data */
        !            67:                        *out_R ++ = *in++;      /* right data */
        !            68:                }
        !            69:        }
        !            70: 
        !            71:        /* send buffer to crossbar */
        !            72:        Crossbar_GetMicrophoneDatas(micro_buffer_L, micro_buffer_R, framesPerBuffer);
        !            73:        
        !            74:        /* get Next Microphone datas */
        !            75:        return paContinue;
        !            76: }
        !            77: 
        !            78: 
        !            79: /*******************************************************************/
        !            80: 
        !            81: /**
        !            82:  * Microphone (jack) inits : init portaudio microphone emulation
        !            83:  *   - sampleRate : system sound frequency
        !            84:  */
        !            85: int Microphone_Start(int sampleRate)
        !            86: {
        !            87:        micro_sampleRate = sampleRate;
        !            88: 
        !            89:        /* Initialize portaudio */
        !            90:        micro_err = Pa_Initialize();
        !            91:        if (micro_err != paNoError) {
        !            92:                Microphone_Error();
        !            93:                return 0;
        !            94:        }
        !            95: 
        !            96:        /* Initialize microphone parameters */
        !            97:        micro_inputParameters.device = Pa_GetDefaultInputDevice();      /* default input device */
        !            98:        if (micro_inputParameters.device == paNoDevice) {
        !            99:                fprintf (stderr, "Microphone: No input device found.\n");
        !           100:                Microphone_Terminate();
        !           101:                return 0;
        !           102:        }
        !           103:        
        !           104:        micro_inputParameters.channelCount = 2;                         /* stereo input */
        !           105:        micro_inputParameters.sampleFormat = paInt16;                   /* 16 bits sound */
        !           106:        micro_inputParameters.suggestedLatency = Pa_GetDeviceInfo (micro_inputParameters.device)->defaultLowInputLatency;
        !           107:        micro_inputParameters.hostApiSpecificStreamInfo = NULL;
        !           108: 
        !           109:        /* Open Microphone stream */
        !           110:        micro_err = Pa_OpenStream (
        !           111:                &micro_stream,
        !           112:                &micro_inputParameters,
        !           113:                NULL,
        !           114:                micro_sampleRate,
        !           115:                FRAMES_PER_BUFFER,
        !           116:                0, /* paClipOff, we won't output out of range samples so don't bother clipping them */
        !           117:                Microphone_Callback,
        !           118:                NULL);
        !           119:        if (micro_err != paNoError) {
        !           120:                Microphone_Error();
        !           121:                return 0;
        !           122:        }
        !           123: 
        !           124:        /* Start microphone recording */
        !           125:        micro_err = Pa_StartStream( micro_stream );
        !           126:        if (micro_err != paNoError) {
        !           127:                Microphone_Error();
        !           128:                return 0;
        !           129:        }
        !           130:        
        !           131:        return 1;
        !           132: }
        !           133: 
        !           134: /**
        !           135:  * Microphone (jack) Error : display current portaudio error
        !           136:  */
        !           137: static void Microphone_Error(void)
        !           138: {
        !           139:        fprintf (stderr, "An error occured while using the portaudio stream\n");
        !           140:        fprintf (stderr, "Error number: %d\n", micro_err);
        !           141:        fprintf (stderr, "Error message: %s\n", Pa_GetErrorText (micro_err));
        !           142: 
        !           143:        Microphone_Terminate();
        !           144: }
        !           145: 
        !           146: /**
        !           147:  * Microphone (jack) Terminate : terminate the microphone emulation
        !           148:  */
        !           149: static int Microphone_Terminate(void)
        !           150: {
        !           151:        micro_err = Pa_Terminate();
        !           152:        if (micro_err != paNoError) {
        !           153:                fprintf (stderr, "PortAudio error: %s\n", Pa_GetErrorText(micro_err));
        !           154:                return -1;
        !           155:        }
        !           156:        return 0;
        !           157: }
        !           158: 
        !           159: /**
        !           160:  * Microphone (jack) stop : stops the current recording
        !           161:  */
        !           162: int Microphone_Stop(void)
        !           163: {
        !           164:        /* Close Microphone stream */
        !           165:        micro_err = Pa_CloseStream(micro_stream);
        !           166:        if (micro_err != paNoError) {
        !           167:                Microphone_Error();
        !           168:                return -1;
        !           169:        }
        !           170: 
        !           171:        return Microphone_Terminate();
        !           172: }
        !           173: 
        !           174: #endif /* HAVE PORTAUDIO */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.