All pastes #236039 Raw Edit

Mine

public text v1 · immutable
·published 2006-11-03 16:10 UTC
rendered paste body
#include <cstdio>
#include <cstdlib>
#include <fcntl.h>
#include <sys/time.h>
#include <unistd.h>
#include <time.h>
#include <cerrno>
#include <cstring>

#include <iostream>
#include <qdatetime.h>

using namespace std;

#include "mythcontext.h"
#include "audiooutputpulse.h"
#include "util.h"

AudioOutputPULSE::AudioOutputPULSE(
    QString laudio_main_device, QString           laudio_passthru_device,
    int     laudio_bits,        int               laudio_channels,
    int     laudio_samplerate,  AudioOutputSource lsource,
    bool    lset_initial_vol,   bool              laudio_passthru) :
    AudioOutputBase(laudio_main_device, laudio_passthru_device,
                    laudio_bits,        laudio_channels,
                    laudio_samplerate,  lsource,
                    lset_initial_vol,   laudio_passthru),
    buff_size(-1), can_hw_pause(false)	    
{
    s = false;
    playing = false;
    closing = false;
    

    // Set everything up
    Reconfigure(laudio_bits, laudio_channels,
                laudio_samplerate, laudio_passthru);
}

AudioOutputPULSE::~AudioOutputPULSE()
{
    // Close down all audio stuff
    CloseDevice();
}

bool AudioOutputPULSE::OpenDevice()
{
    VERBOSE(VB_AUDIO, QString("Opening PULSE audio device."));
    CloseDevice();
    VERBOSE(VB_AUDIO, QString("Continue Opening PULSE audio device."));



    if (audio_bits == 16) {
        ss.format = PA_SAMPLE_S16LE;
	VERBOSE(VB_AUDIO, QString("PULSE with PA_SAMPLE_S16LE."));
    } else {
        ss.format = PA_SAMPLE_FLOAT32LE;
	VERBOSE(VB_AUDIO, QString("PULSE with PA_SAMPLE_FLOAT32LE."));
    }
    ss.channels = audio_channels;
    VERBOSE(VB_AUDIO, QString("PULSE with %1 channels.").arg(audio_channels));
    ss.rate = audio_samplerate;
    VERBOSE(VB_AUDIO, QString("PULSE with %1 samplerate.").arg(audio_samplerate));


    
    int error;
    s = pa_simple_new(NULL,               // Use the default server.
                   "MythMusic",           // Our application's name.
                   PA_STREAM_PLAYBACK,
                   NULL,               // Use the default device.
                   "Music",            // Description of our stream.
                   &ss,                // Our sample format.
                   NULL,               // Use default channel map
                   NULL,               // Use default buffering attributes.
                   &error               // Ignore error code.
                   );

    fragment_size = 1024;

    if (!s) {
        Error(QString(" pa_simple_new() failed (%1)").arg(error));
        Error(QString(" pa_simple_new() failed: %1").arg(pa_strerror(error)));
	CloseDevice();
	return false;
    }

    // Setup volume control
    if (internal_vol)
        VolumeInit();

    // Device opened successfully
    return true; 
}

void AudioOutputPULSE::CloseDevice()
{
    if (!s) {
        return;
    }

    closing = true;
    VERBOSE(VB_AUDIO, QString("Entering closing PULSE audio device."));
    while(playing) {
        usleep(1000);
    }

    VERBOSE(VB_AUDIO, QString("Closing PULSE audio device."));
    pa_simple *s2 = s;
    s = false;
    
    pa_simple_free(s2);
    closing = false;
    VERBOSE(VB_AUDIO, QString("Done closing PULSE audio device."));
}

void AudioOutputPULSE::WriteAudio(unsigned char *aubuf, int size)
{
    if (!s) {
        return;
    }
    if (closing) {
        return;
    }
    
   
    VERBOSE(VB_AUDIO, QString("Writing to PULSE: buffer size %1").arg(size));
    int error;
    playing = true;
    if (pa_simple_write(s, aubuf, size, &error) < 0) {
        playing = false;
        Error(QString(" pa_simple_write() failed: %1").arg(pa_strerror(error)));
    	return;
    }
    playing = false;
    VERBOSE(VB_AUDIO, QString("Done writing to PULSE: buffer size %1").arg(size));
}


inline int AudioOutputPULSE::getBufferedOnSoundcard(void)
{
    return 0;
    //return  JACK_GetBytesStored(audioid) + fragment_size * 2;
}

inline int AudioOutputPULSE::getSpaceOnSoundcard(void)
{
    return 1024;
}

void AudioOutputPULSE::VolumeInit(void)
{
}

int AudioOutputPULSE::GetVolumeChannel(int channel)
{
    return 100;
}

void AudioOutputPULSE::SetVolumeChannel(int channel, int volume)
{
}