void OpenALController::record() {
	ALubyte *captureBufPtr;
	qDebug() << "Starting capture NOW!";
	m_samplesCaptured = 0;
	captureBufPtr = m_captureBuffer;

	this->setRecording(true);
	alcCaptureStart(m_captureDev);
	alcGetIntegerv(m_captureDev, ALC_CAPTURE_SAMPLES,
			(ALCsizei) sizeof(ALubyte), &m_samplesAvailable);
	while (m_samplesCaptured < FREQ * 5) {
		if (0 < m_samplesAvailable && m_samplesAvailable <= FREQ) {
			alcCaptureSamples(m_captureDev, captureBufPtr, m_samplesAvailable);
			checkError("alcCaptureSamples");
			m_samplesCaptured += m_samplesAvailable;
			//qDebug()
			//		<<qPrintable(QString("Captured %1 samples (adding %2)\n").arg(m_samplesCaptured).arg(m_samplesAvailable));

			// Advance the buffer (two bytes per sample * number of samples)
			captureBufPtr += m_samplesAvailable * 2;
		} else {
			qDebug() << "No captured samples:" << m_samplesAvailable;
		}
		// Wait for a bit
		//alutSleep(0.02);
		printf(".");
		fflush(stdout);
		alcGetIntegerv(m_captureDev, ALC_CAPTURE_SAMPLES,
				(ALCsizei) sizeof(ALubyte), &m_samplesAvailable);
	}
	qDebug() << "\nDone capturing.\n";
	alcCaptureStop(m_captureDev);
	this->setRecording(false);
}
Exemple #2
0
void *encode_audio_thread(void *arg)
{
    INFO("Started encode audio thread!");
    av_session_t *_phone = arg;
    _phone->running_encaud = 1;

    int ret = 0;
    int16_t frame[4096];
    int frame_size = AUDIO_FRAME_SIZE;
    ALint sample = 0;
    alcCaptureStart((ALCdevice *)_phone->audio_capture_device);
    while (_phone->running_encaud) {
        
        alcGetIntegerv((ALCdevice *)_phone->audio_capture_device, ALC_CAPTURE_SAMPLES, (ALCsizei)sizeof(ALint), &sample);
        
        if (sample >= frame_size) {
            alcCaptureSamples((ALCdevice *)_phone->audio_capture_device, frame, frame_size);

            ret = toxav_send_audio(_phone->av, frame, frame_size);

            if (ret < 0) printf("Could not encode or send audio packet\n");

        } else {
            usleep(1000);
        }
    }

    /* clean up codecs *
    pthread_mutex_lock(&cs->ctrl_mutex);* /
    alcCaptureStop((ALCdevice*)_phone->audio_capture_device);
    alcCaptureCloseDevice((ALCdevice*)_phone->audio_capture_device);
    / *pthread_mutex_unlock(&cs->ctrl_mutex);*/
    _phone->running_encaud = -1;
    pthread_exit ( NULL );
}
Exemple #3
0
bool OpenAL::initInput(const QString& deviceName)
{
    if (!Settings::getInstance().getAudioInDevEnabled())
        return false;

    qDebug() << "Opening audio input" << deviceName;
    assert(!alInDev);

    // TODO: Try to actually detect if our audio source is stereo
    int stereoFlag = AUDIO_CHANNELS == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16;
    const uint32_t sampleRate = AUDIO_SAMPLE_RATE;
    const uint16_t frameDuration = AUDIO_FRAME_DURATION;
    const uint32_t chnls = AUDIO_CHANNELS;
    const ALCsizei bufSize = (frameDuration * sampleRate * 4) / 1000 * chnls;

    const QByteArray qDevName = deviceName.toUtf8();
    const ALchar* tmpDevName = qDevName.isEmpty() ? nullptr : qDevName.constData();
    alInDev = alcCaptureOpenDevice(tmpDevName, sampleRate, stereoFlag, bufSize);

    // Restart the capture if necessary
    if (!alInDev) {
        qWarning() << "Failed to initialize audio input device:" << deviceName;
        return false;
    }

    setInputGain(Settings::getInstance().getAudioInGainDecibel());

    qDebug() << "Opened audio input" << deviceName;
    alcCaptureStart(alInDev);

    return true;
}
Exemple #4
0
void Core::prepareCall(int friendId, int callId, ToxAv* toxav, bool videoEnabled)
{
    qDebug() << QString("Core: preparing call %1").arg(callId);
    calls[callId].callId = callId;
    calls[callId].friendId = friendId;
    calls[callId].muteMic = false;
    // the following three lines are also now redundant from startCall, but are
    // necessary there for outbound and here for inbound
    calls[callId].codecSettings = av_DefaultSettings;
    calls[callId].codecSettings.max_video_width = TOXAV_MAX_VIDEO_WIDTH;
    calls[callId].codecSettings.max_video_height = TOXAV_MAX_VIDEO_HEIGHT;
    calls[callId].videoEnabled = videoEnabled;
    toxav_prepare_transmission(toxav, callId, av_jbufdc, av_VADd, videoEnabled);

    // Audio
    alGenSources(1, &calls[callId].alSource);
    alcCaptureStart(alInDev);

    // Go
    calls[callId].active = true;
    calls[callId].sendAudioTimer->setInterval(5);
    calls[callId].sendAudioTimer->setSingleShot(true);
    connect(calls[callId].sendAudioTimer, &QTimer::timeout, [=](){sendCallAudio(callId,toxav);});
    calls[callId].sendAudioTimer->start();
    calls[callId].sendVideoTimer->setInterval(50);
    calls[callId].sendVideoTimer->setSingleShot(true);
    if (calls[callId].videoEnabled)
    {
        calls[callId].sendVideoTimer->start();
        Widget::getInstance()->getCamera()->suscribe();
    }
}
Exemple #5
0
static void alccapturestart(void *handle) {
    if(handle == (void*)1) {
        audio_init(handle);
        return;
    }
    alcCaptureStart(handle);
}
Exemple #6
0
AudioAnalyzer::AudioAnalyzer(int frequency_, int captureSize_) :
	frequency(frequency_), captureSize(captureSize_), initialized(false)
{
	ALenum errorCode=0;
	inputDevice = alcCaptureOpenDevice(NULL, frequency, AL_FORMAT_MONO16, frequency/2);
	if (inputDevice == NULL) {
		Logger::Instance()->OutputString("Error: alcCaptureOpenDevice");
		return;
	}

	errorCode = alcGetError(inputDevice);
	if (errorCode != AL_NO_ERROR) {
		Logger::Instance()->OutputString("Error: alcCaptureOpenDevice -- ?");
		return;
	}
	alcCaptureStart(inputDevice); // Begin capturing
	errorCode = alcGetError(inputDevice);
	if (errorCode != AL_NO_ERROR) {
		Logger::Instance()->OutputString("Error: alcCaptureStart");
		alcCaptureCloseDevice(inputDevice);
		return;
	}

	capturedBuffer = new  short[captureSize];
	ffted = new float[captureSize];
	ar = new float[captureSize];
	ai = new float[captureSize];

	initialized = true;

	Logger::Instance()->OutputString("OpenAL succeeded");
}
// Executed inside the worker-thread.
// It is not safe to access V8, or V8 data structures
// here, so everything we need for input and output
// should go on `this`.
void ALCaptureWorker::Execute(const ExecutionProgress& progress)
{
	ALCint			samplesIn = 0;

	alcCaptureStart(device);

	while(*this->capturing)
	{
		alcGetIntegerv(device, ALC_CAPTURE_SAMPLES, 1, &samplesIn);

		if (samplesIn > CAPTURE_SIZE) {

			int sampleSize = CAPTURE_SIZE * sizeof(short);

			char* captured = (char*)malloc(sampleSize);

			alcCaptureSamples(device, captured, CAPTURE_SIZE);

			if (*this->capturing)
			{
				progress.Send(captured, sampleSize);
			}

			delete captured;
		}

		sleep_ms(1);
	}
}
static gboolean
gst_openal_src_prepare (GstAudioSrc * audiosrc, GstAudioRingBufferSpec * spec)
{
  GstOpenalSrc *openalsrc = GST_OPENAL_SRC (audiosrc);

  gst_openal_src_parse_spec (openalsrc, spec);
  if (openalsrc->format == AL_NONE) {
    GST_ELEMENT_ERROR (openalsrc, RESOURCE, SETTINGS, (NULL),
        ("Unable to get type %d, format %d, and %d channels", spec->type,
            GST_AUDIO_INFO_FORMAT (&spec->info),
            GST_AUDIO_INFO_CHANNELS (&spec->info)));
    return FALSE;
  }

  openalsrc->device =
      alcCaptureOpenDevice (openalsrc->default_device, openalsrc->rate,
      openalsrc->format, openalsrc->buffer_length);

  if (!openalsrc->device) {
    GST_ELEMENT_ERROR (openalsrc, RESOURCE, OPEN_READ,
        ("Could not open device."), GST_ALC_ERROR (openalsrc->device));
    return FALSE;
  }

  openalsrc->default_device_name =
      g_strdup (alcGetString (openalsrc->device, ALC_DEVICE_SPECIFIER));

  alcCaptureStart (openalsrc->device);

  return TRUE;
}
bool RecordingDevice::start(int samples, int sampleRate, int bitDepth, int channels)
{
	ALenum format = Audio::getFormat(bitDepth, channels);
	if (format == AL_NONE)
		throw InvalidFormatException(channels, bitDepth);

	if (samples <= 0)
		throw love::Exception("Invalid number of samples.");

	if (sampleRate <= 0)
		throw love::Exception("Invalid sample rate.");

	if (isRecording())
		stop();

	device = alcCaptureOpenDevice(name.c_str(), sampleRate, format, samples);
	if (device == nullptr)
		return false;

	alcCaptureStart(device);

	this->samples = samples;
	this->sampleRate = sampleRate;
	this->bitDepth = bitDepth;
	this->channels = channels;

	return true;
}
Exemple #10
0
void* recAndSend(void * param){
  ALshort alrecBuffer[SAMPLESIZE];
  ALint alSample;
  ALCdevice* device = alcOpenDevice(NULL);
  ALCcontext* context = alcCreateContext(device,  NULL);
  alcMakeContextCurrent(context);
  ALCdevice* alDevice = alcCaptureOpenDevice(NULL, SRATE, AL_FORMAT_MONO16, SAMPLESIZE);
  alcGetError(alDevice);
  alcCaptureStart(alDevice);
  alcGetError(alDevice);
  while (1){
    alcGetIntegerv(alDevice, ALC_CAPTURE_SAMPLES, (ALCsizei)sizeof(ALint), &alSample);
    alcGetError(alDevice);
    if(alSample > SAMPLESIZE/2) {
      alcCaptureSamples(alDevice, (ALCvoid *)alrecBuffer, alSample);
      int n;
      socklen_t addrlen = sizeof(senderinfo);
      int i;
      for(i=0; i<alSample; i++){
        if(abs((int)alrecBuffer[i]) > (0.8*INT16_MAX) ) break;
      }
      if(i==alSample) continue;
      if((n = sendto(sock, alrecBuffer, alSample*2, 0, (struct sockaddr *)&senderinfo, addrlen)) != alSample*2){
        perror("sendto");
        exit(1);
      }
    }
    if(callFlag==OFF) break;
  }
  alcCaptureCloseDevice(alDevice);
  alcCaptureStop(alDevice);
  alcCloseDevice(device);
//  fprintf(stderr, "close recAndSend\n");
}
Exemple #11
0
bool SoundRecorder::setDevice(const std::string& name)
{
    // Store the device name
    if (name.empty())
        m_deviceName = getDefaultDevice();
    else
        m_deviceName = name;

    if (m_isCapturing)
    {
        // Stop the capturing thread
        m_isCapturing = false;
        m_thread.wait();

        // Open the requested capture device for capturing 16 bits mono samples
        captureDevice = alcCaptureOpenDevice(name.c_str(), m_sampleRate, AL_FORMAT_MONO16, m_sampleRate);
        if (!captureDevice)
        {
            // Notify derived class
            onStop();

            err() << "Failed to open the audio capture device with the name: " << m_deviceName << std::endl;
            return false;
        }

        // Start the capture
        alcCaptureStart(captureDevice);

        // Start the capture in a new thread, to avoid blocking the main thread
        m_isCapturing = true;
        m_thread.launch();
    }

    return true;
}
Exemple #12
0
void Audio::openInput(const QString& inDevDescr)
{
    auto* tmp = alInDev;
    alInDev = nullptr;
    if (tmp)
        alcCaptureCloseDevice(tmp);
    int stereoFlag = av_DefaultSettings.audio_channels==1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16;
    if (inDevDescr.isEmpty())
        alInDev = alcCaptureOpenDevice(nullptr,av_DefaultSettings.audio_sample_rate, stereoFlag,
            (av_DefaultSettings.audio_frame_duration * av_DefaultSettings.audio_sample_rate * 4)
                                       / 1000 * av_DefaultSettings.audio_channels);
    else
        alInDev = alcCaptureOpenDevice(inDevDescr.toStdString().c_str(),av_DefaultSettings.audio_sample_rate, stereoFlag,
            (av_DefaultSettings.audio_frame_duration * av_DefaultSettings.audio_sample_rate * 4)
                                       / 1000 * av_DefaultSettings.audio_channels);
    if (!alInDev)
        qWarning() << "Audio: Cannot open input audio device";
    else
        qDebug() << "Audio: Opening audio input "<<inDevDescr;

    Core::getInstance()->resetCallSources(); // Force to regen each group call's sources

    // Restart the capture if necessary
    if (userCount.load() != 0 && alInDev)
        alcCaptureStart(alInDev);
}
void OpenALController::recordToStreamBuffer(qint16 *samples, int frame_size,
		int nb_channels) {
	//qDebug() << "Starting capture NOW!";

	Q_UNUSED(nb_channels);
	int samplesCaptured = 0, samplesAvailable = 0;
	qint16 * captureBufPtr;
	captureBufPtr = samples;

	//this->setRecording(true);
	alcCaptureStart(m_captureDev);
	alcGetIntegerv(m_captureDev, ALC_CAPTURE_SAMPLES,
			(ALCsizei) sizeof(qint16), &samplesAvailable);
	int samplesToCopy = frame_size - samplesCaptured;
	while (samplesCaptured < frame_size) {
		if (samplesAvailable > 0 && samplesToCopy > samplesAvailable) {
			samplesToCopy = samplesAvailable;
		}
		alcCaptureSamples(m_captureDev, captureBufPtr, samplesToCopy);
		checkError("alcCaptureSamples");
		samplesCaptured += samplesToCopy;
		///* Advance the buffer (two bytes per sample * number of samples) */
		captureBufPtr += samplesToCopy;// * 2;
		alcGetIntegerv(m_captureDev, ALC_CAPTURE_SAMPLES,
				(ALCsizei) sizeof(ALubyte), &samplesAvailable);
	}
	//qDebug() << "oal:" << frame_size;;
	//qDebug() << "\nDone capturing. samples captured:" << accum;
	/*alcCaptureStop(m_captureDev); */
	//this->setRecording(false);
}
Exemple #14
0
/**
Open an input device, use before suscribing
*/
void Audio::openInput(const QString& inDevDescr)
{
    QMutexLocker lock(&audioInLock);

    if (alInDev) {
#if (!FIX_SND_PCM_PREPARE_BUG)
        qDebug() << "stopping capture";
        alcCaptureStop(alInDev);
#endif
        alcCaptureCloseDevice(alInDev);
    }
    alInDev = nullptr;

    /// TODO: Try to actually detect if our audio source is stereo
    int stereoFlag = AUDIO_CHANNELS == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16;
    const uint32_t sampleRate = AUDIO_SAMPLE_RATE;
    const uint16_t frameDuration = AUDIO_FRAME_DURATION;
    const uint32_t chnls = AUDIO_CHANNELS;
    const ALCsizei bufSize = (frameDuration * sampleRate * 4) / 1000 * chnls;
    if (inDevDescr.isEmpty())
        alInDev = alcCaptureOpenDevice(nullptr, sampleRate, stereoFlag, bufSize);
    else
        alInDev = alcCaptureOpenDevice(inDevDescr.toStdString().c_str(),
                                       sampleRate, stereoFlag, bufSize);

    if (alInDev)
        qDebug() << "Opening audio input "<<inDevDescr;
    else
        qWarning() << "Cannot open input audio device " + inDevDescr;

    Core* core = Core::getInstance();
    if (core)
        core->getAv()->resetCallSources(); // Force to regen each group call's sources

    // Restart the capture if necessary
    if (alInDev)
    {
        alcCaptureStart(alInDev);
    }
    else
    {
#if (FIX_SND_PCM_PREPARE_BUG)
        alcCaptureStart(alInDev);
#endif
    }
}
Exemple #15
0
void AudioRecorder::startRecord()
{
    initRecorder(m_filePath.toUtf8().data());

    m_recordDevice = alcCaptureOpenDevice(NULL, 16000, AL_FORMAT_MONO16, 1024 * 8);
    alcCaptureStart(m_recordDevice);
    m_updateRecordTimer.start(20);
}
int main()
{
    unsigned int sample_rate = 48000;
    unsigned int samples_perframe = sample_rate/50;
    _Bool filter = 1;

    const char *in_device_list = alcGetString(NULL, ALC_CAPTURE_DEVICE_SPECIFIER);

    const char *temp_d = in_device_list;
    while (*temp_d) {
        printf("%s\n", temp_d);
        temp_d += strlen(temp_d) + 1;
    }

    ALCdevice *device_in = alcCaptureOpenDevice(in_device_list, sample_rate, AL_FORMAT_MONO16, samples_perframe);
    if (!device_in) {
        printf("open in dev failed\n");
        return 0;
    }

    const char *out_device_list = alcGetString(NULL, ALC_ALL_DEVICES_SPECIFIER);
    ALCdevice *device_out = alcOpenDevice(out_device_list);

    ALCcontext *context = alcCreateContext(device_out, NULL);
    if(!alcMakeContextCurrent(context)) {
        printf("alcMakeContextCurrent() failed\n");
        alcCloseDevice(device_out);
        return 0;
    }

    Filter_Audio *f_a = new_filter_audio(sample_rate);

    ALuint source;
    alGenSources(1, &source);
    alcCaptureStart(device_in);

    printf("Starting\n");

    while (1) {
        ALint samples;
        alcGetIntegerv(device_in, ALC_CAPTURE_SAMPLES, sizeof(samples), &samples);
        //printf("%u\n", samples);
        if(samples >= samples_perframe) {
            int16_t buf[samples_perframe];
            alcCaptureSamples(device_in, buf, samples_perframe);
            if (filter && filter_audio(f_a, buf, samples_perframe) == -1) {
                printf("filter_audio fail\n");
                return 0;
            }

            sourceplaybuffer(source, buf, samples_perframe, 1, sample_rate);
        }

        usleep(1000);
    }

    return 0;
}
Exemple #17
0
/**
Open an input device, use before suscribing
*/
void Audio::openInput(const QString& inDevDescr)
{
    QMutexLocker lock(&audioInLock);

    if (alInDev) {
#if (!FIX_SND_PCM_PREPARE_BUG)
        qDebug() << "stopping capture";
        alcCaptureStop(alInDev);
#endif
        alcCaptureCloseDevice(alInDev);
    }
    alInDev = nullptr;

    int stereoFlag = av_DefaultSettings.audio_channels==1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16;
    const uint32_t sampleRate = av_DefaultSettings.audio_sample_rate;
    const uint16_t frameDuration = av_DefaultSettings.audio_frame_duration;
    const uint32_t chnls = av_DefaultSettings.audio_channels;
    const ALCsizei bufSize = (frameDuration * sampleRate * 4) / 1000 * chnls;
    if (inDevDescr.isEmpty())
        alInDev = alcCaptureOpenDevice(nullptr, sampleRate, stereoFlag, bufSize);
    else
        alInDev = alcCaptureOpenDevice(inDevDescr.toStdString().c_str(),
                                       sampleRate, stereoFlag, bufSize);

    if (alInDev)
        qDebug() << "Opening audio input "<<inDevDescr;
    else
        qWarning() << "Cannot open input audio device " + inDevDescr;

    Core* core = Core::getInstance();
    if (core)
        core->resetCallSources(); // Force to regen each group call's sources

    // Restart the capture if necessary
    if (alInDev)
    {
        alcCaptureStart(alInDev);
    }
    else
    {
#if (FIX_SND_PCM_PREPARE_BUG)
        alcCaptureStart(alInDev);
#endif
    }
}
Exemple #18
0
int CaptureStreamT::Read(unsigned char* Buffer, unsigned int Size)
{
    const unsigned int MAX_WRITE_SAMPLES=Size/BytesPerSample(m_FORMAT);

    // If this is the first read after initialization or a rewind, start capturing now.
    // When capturing has been stopped before and is restarted here, GetNumCaptureSamples() should return 0,
    // just as if it had been started for the first time. See Rewind() for more information.
    if (!m_IsCapturing)
    {
        alcCaptureStart(m_CaptureDevice);
        m_IsCapturing=true;
    }

    // std::cout << "\n" << __FUNCTION__ << "():\n" << "        "; PrintDebug();


    // If there are not enough "live" capture samples available, fill-in zeros until
    // the buffer is half full. This gives the device the chance to capture more data.
    if (GetNumCaptureSamples() < m_MAX_CAPTURE_BUFFER_SAMPLES/8)
    {
        m_ZeroSamples=m_MAX_CAPTURE_BUFFER_SAMPLES/2-GetNumCaptureSamples();

        // std::cout << "  + ... "; PrintDebug();
    }

    // If the capture buffer is too full, we have probably lost data already.
    // In order to prevent this from happening over and over again, reduce it to half its size.
    if (m_ZeroSamples+GetNumCaptureSamples() >= m_MAX_CAPTURE_BUFFER_SAMPLES)
    {
        m_ZeroSamples=0;
        ReduceSamplesTo(m_MAX_CAPTURE_BUFFER_SAMPLES/2 + MAX_WRITE_SAMPLES);

        // std::cout << "  - ... "; PrintDebug();
    }


    // Write the leading zero samples.
    unsigned int SamplesWritten=std::min(m_ZeroSamples, MAX_WRITE_SAMPLES);

    memset(Buffer, 0, SamplesWritten*BytesPerSample(m_FORMAT));
    m_ZeroSamples-=SamplesWritten;

    // Write the samples with real, live, captured data.
    if (GetNumCaptureSamples()>0 && SamplesWritten<MAX_WRITE_SAMPLES)
    {
        const unsigned int NumLive=std::min(GetNumCaptureSamples(), MAX_WRITE_SAMPLES-SamplesWritten);

        alcCaptureSamples(m_CaptureDevice, &Buffer[SamplesWritten*BytesPerSample(m_FORMAT)], NumLive);
        SamplesWritten+=NumLive;
    }

    // std::cout << "        " << SamplesWritten << " samples written,\n" << "     =  "; PrintDebug();

    return SamplesWritten*BytesPerSample(m_FORMAT);
}
void SoundController::setIsRecording(bool isit)
{
	if (isRecording == isit) return;
	
	isRecording = isit;
	
	if (!captureDevice) return;
	
	if (isRecording)
		alcCaptureStart(captureDevice);
	else
		alcCaptureStop(captureDevice);
}
Exemple #20
0
color_organ_t *color_organ_init(double sample_rate, size_t capturebuf_size) {
    color_organ_t *c = malloc(sizeof(color_organ_t));
    
    c->mic = alcCaptureOpenDevice(NULL, (ALCuint) sample_rate, AL_FORMAT_MONO16, (ALCsizei) capturebuf_size);
    if (alGetError() != AL_NO_ERROR) {
        return NULL;
    }
    
    c->capturebuf_size = capturebuf_size;
    c->capture_buf = malloc(capturebuf_size * sizeof(int16_t));
    
    alcCaptureStart(c->mic);
    
    return c;
}
Exemple #21
0
bool SoundRecorder::start(unsigned int sampleRate)
{
    // Check if the device can do audio capture
    if (!isAvailable())
    {
        err() << "Failed to start capture: your system cannot capture audio data (call SoundRecorder::isAvailable to check it)" << std::endl;
        return false;
    }

    // Check that another capture is not already running
    if (captureDevice)
    {
        err() << "Trying to start audio capture, but another capture is already running" << std::endl;
        return false;
    }

    // Determine the recording format
    ALCenum format = (m_channelCount == 1) ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16;

    // Open the capture device for capturing 16 bits samples
    captureDevice = alcCaptureOpenDevice(m_deviceName.c_str(), sampleRate, format, sampleRate);
    if (!captureDevice)
    {
        err() << "Failed to open the audio capture device with the name: " << m_deviceName << std::endl;
        return false;
    }

    // Clear the array of samples
    m_samples.clear();

    // Store the sample rate
    m_sampleRate = sampleRate;

    // Notify derived class
    if (onStart())
    {
        // Start the capture
        alcCaptureStart(captureDevice);

        // Start the capture in a new thread, to avoid blocking the main thread
        m_isCapturing = true;
        m_thread.launch();

        return true;
    }

    return false;
}
Exemple #22
0
/**
@brief Subscribe to capture sound from the opened input device.

If the input device is not open, it will be opened before capturing.
*/
void Audio::subscribeInput()
{
    qDebug() << "subscribing input" << inputSubscriptions;
    if (!inputSubscriptions++)
    {
        openInput(Settings::getInstance().getInDev());
        openOutput(Settings::getInstance().getOutDev());

#if (!FIX_SND_PCM_PREPARE_BUG)
        if (alInDev)
        {
            qDebug() << "starting capture";
            alcCaptureStart(alInDev);
        }
#endif
    }
}
static gboolean
gst_openal_src_prepare (GstAudioSrc * asrc, GstRingBufferSpec * spec)
{

  GstOpenalSrc *osrc = GST_OPENAL_SRC (asrc);
  ALenum format;
  guint64 bufferSize;

  switch (spec->width) {
    case 8:
      format = AL_FORMAT_STEREO8;
      break;
    case 16:
      format = AL_FORMAT_STEREO16;
      break;
    default:
      g_assert_not_reached ();
  }

  bufferSize =
      spec->buffer_time * spec->rate * spec->bytes_per_sample / 1000000;

  GST_INFO_OBJECT (osrc, "Open device : %s", osrc->deviceName);
  osrc->deviceHandle =
      alcCaptureOpenDevice (osrc->device, spec->rate, format, bufferSize);

  if (!osrc->deviceHandle) {
    GST_ELEMENT_ERROR (osrc,
        RESOURCE,
        FAILED,
        ("Can't open device \"%s\"", osrc->device),
        ("Can't open device \"%s\"", osrc->device)
        );
    return FALSE;
  }

  osrc->deviceName =
      g_strdup (alcGetString (osrc->deviceHandle, ALC_DEVICE_SPECIFIER));
  osrc->bytes_per_sample = spec->bytes_per_sample;

  GST_INFO_OBJECT (osrc, "Start capture");
  alcCaptureStart (osrc->deviceHandle);

  return TRUE;
}
Exemple #24
0
void Audio::suscribeInput()
{
    if (!alInDev)
    {
        qWarning()<<"input device is closed";
        return;
    }

    qDebug() << "suscribing input";
    QMutexLocker lock(audioInLock);
    if (!userCount++ && alInDev)
    {
#if (!FIX_SND_PCM_PREPARE_BUG)
        qDebug() << "starting capture";
        alcCaptureStart(alInDev);
#endif
    }
}
SoundController::SoundController(Controller *aController) : controller(aController)
{
	device = alcOpenDevice(NULL);
	if (!device) throw std::runtime_error("Could not open sound device.");
	context = alcCreateContext(device, NULL);
	if (!context) throw std::runtime_error("Could not create sound context.");
	
	alcMakeContextCurrent(context);
	
	alListenerf(AL_GAIN, 1.0f);
	
	capturedNoiseLevel = 0;
	
	// Sound capture
	captureDevice = alcCaptureOpenDevice(NULL, 44000, AL_FORMAT_MONO8, 2000);
	if (captureDevice) alcCaptureStart(captureDevice);
	isRecording = true;
}
Exemple #26
0
AUD_NAMESPACE_BEGIN

OpenALReader::OpenALReader(Specs specs, int buffersize) :
	m_specs(specs),
	m_position(0),
	m_device(nullptr)
{
	if((specs.channels != CHANNELS_MONO) && (specs.channels != CHANNELS_STEREO))
		specs.channels = CHANNELS_MONO;

	m_device = alcCaptureOpenDevice(nullptr, specs.rate,
									specs.channels == CHANNELS_MONO ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16,
									buffersize * specs.channels * 2);

	if(!m_device)
		AUD_THROW(DeviceException, "The capture device couldn't be opened with OpenAL.");

	alcCaptureStart(m_device);
}
Exemple #27
0
	bool cAudioCapture::beginCapture()
	{
		cAudioMutexBasicLock lock(Mutex);
		if(!Capturing)
		{
			CaptureBuffer.clear();
			if(CaptureDevice && Ready)
			{
				alcCaptureStart(CaptureDevice);
				Capturing = true;
				getLogger()->logDebug("AudioCapture", "OpenAL Capture Started.");
				signalEvent(ON_BEGINCAPTURE);
			}
			checkError();
			return Capturing;
		}
		checkError();
		return false;
	}
Exemple #28
0
 int psm_record::start(int gap, int rate){
     alGetError();
     int channels = AL_MONO_SOFT;
     int type = AL_SHORT_SOFT;
     context_ = &rc_;
     context_->gap = gap;
     context_->channels = channels;
     context_->type = type;
     context_->rate = rate;
     int SSIZE = rate * FramesToBytes(1, channels, type) * 1/*1000ms, samples bytes*/;
     context_->format = GetFormat(channels, type, alIsBufferFormatSupportedSOFT);
     ALCdevice *device = alcCaptureOpenDevice(NULL, context_->rate, context_->format, SSIZE);
     if (alGetError() != AL_NO_ERROR) {
         return -1;
     }
     alcCaptureStart(device);
     context_->device = device;
     return 0;
 }
void SoundRecorder::start(unsigned int sampleRate)
{
    // Check if the device can do audio capture
    if (!isAvailable())
    {
        err() << "Failed to start capture : your system cannot capture audio data (call SoundRecorder::IsAvailable to check it)" << std::endl;
        return;
    }

    // Check that another capture is not already running
    if (captureDevice)
    {
        err() << "Trying to start audio capture, but another capture is already running" << std::endl;
        return;
    }

    // Open the capture device for capturing 16 bits mono samples
    captureDevice = alcCaptureOpenDevice(NULL, sampleRate, AL_FORMAT_MONO16, sampleRate);
    if (!captureDevice)
    {
        err() << "Failed to open the audio capture device" << std::endl;
        return;
    }

    // Clear the array of samples
    m_samples.clear();

    // Store the sample rate
    m_sampleRate = sampleRate;

    // Notify derived class
    if (onStart())
    {
        // Start the capture
        alcCaptureStart(captureDevice);

        // Start the capture in a new thread, to avoid blocking the main thread
        m_isCapturing = true;
        m_thread.launch();
    }
}
void plVoiceRecorder::SetMikeOpen(hsBool b)
{
    ALCdevice *device = plgAudioSys::GetCaptureDevice();
    if (fRecording && device)
    {       
        if (b)
        {
            alcCaptureStart(device);
        }
        else
        {
            alcCaptureStop(device);
        }
        DrawTalkIcon(b);
        fMikeOpen = b;
    }
    else
    {
        DrawDisabledIcon(b);        // voice recording is unavailable or disabled
    }
}