Beispiel #1
0
int freerdp_rdpsnd_client_subsystem_entry(PFREERDP_RDPSND_DEVICE_ENTRY_POINTS pEntryPoints)
{
	ADDIN_ARGV* args;
	rdpsndWinmmPlugin* winmm;

	winmm = (rdpsndWinmmPlugin*) calloc(1, sizeof(rdpsndWinmmPlugin));

	if (!winmm)
		return -1;

	winmm->device.DisableConfirmThread = TRUE;

	winmm->device.Open = rdpsnd_winmm_open;
	winmm->device.FormatSupported = rdpsnd_winmm_format_supported;
	winmm->device.SetFormat = rdpsnd_winmm_set_format;
	winmm->device.GetVolume = rdpsnd_winmm_get_volume;
	winmm->device.SetVolume = rdpsnd_winmm_set_volume;
	winmm->device.WaveDecode = rdpsnd_winmm_wave_decode;
	winmm->device.WavePlay = rdpsnd_winmm_wave_play;
	winmm->device.Start = rdpsnd_winmm_start;
	winmm->device.Close = rdpsnd_winmm_close;
	winmm->device.Free = rdpsnd_winmm_free;

	args = pEntryPoints->args;
	rdpsnd_winmm_parse_addin_args((rdpsndDevicePlugin*) winmm, args);

	winmm->dsp_context = freerdp_dsp_context_new();

	pEntryPoints->pRegisterRdpsndDevice(pEntryPoints->rdpsnd, (rdpsndDevicePlugin*) winmm);

	return 0;
}
Beispiel #2
0
int freerdp_rdpsnd_client_subsystem_entry(PFREERDP_RDPSND_DEVICE_ENTRY_POINTS pEntryPoints)
{
	ADDIN_ARGV* args;
	rdpsndAudioQPlugin* aqPlugin;
    
	aqPlugin = (rdpsndAudioQPlugin*) malloc(sizeof(rdpsndAudioQPlugin));
	ZeroMemory(aqPlugin, sizeof(rdpsndAudioQPlugin));

	aqPlugin->device.Open = rdpsnd_audio_open;
	aqPlugin->device.FormatSupported = rdpsnd_audio_format_supported;
	aqPlugin->device.SetFormat = rdpsnd_audio_set_format;
	aqPlugin->device.SetVolume = rdpsnd_audio_set_volume;
	aqPlugin->device.Play = rdpsnd_audio_play;
	aqPlugin->device.Start = rdpsnd_audio_start;
	aqPlugin->device.Close = rdpsnd_audio_close;
	aqPlugin->device.Free = rdpsnd_audio_free;

	args = pEntryPoints->args;
    
	if (args->argc > 2)
	{
		/* TODO: parse device name */
	}

	pEntryPoints->pRegisterRdpsndDevice(pEntryPoints->rdpsnd, (rdpsndDevicePlugin*) aqPlugin);

	return 0;
}
Beispiel #3
0
int FreeRDPRdpsndDeviceEntry(PFREERDP_RDPSND_DEVICE_ENTRY_POINTS pEntryPoints)
{
	rdpsndAudioQPlugin* aqPlugin;
	RDP_PLUGIN_DATA* data;
    
	aqPlugin = xnew(rdpsndAudioQPlugin);

	aqPlugin->device.Open = rdpsnd_audio_open;
	aqPlugin->device.FormatSupported = rdpsnd_audio_format_supported;
	aqPlugin->device.SetFormat = rdpsnd_audio_set_format;
	aqPlugin->device.SetVolume = rdpsnd_audio_set_volume;
	aqPlugin->device.Play = rdpsnd_audio_play;
	aqPlugin->device.Start = rdpsnd_audio_start;
	aqPlugin->device.Close = rdpsnd_audio_close;
	aqPlugin->device.Free = rdpsnd_audio_free;

	data = pEntryPoints->plugin_data;
    
	if (data && strcmp((char *)data->data[0], "macaudio") == 0) {
		if(strlen((char *)data->data[1]) > 0)
			aqPlugin->device_name = strdup((char *)data->data[1]);
		else
			aqPlugin->device_name = NULL;
	}
	pEntryPoints->pRegisterRdpsndDevice(pEntryPoints->rdpsnd, (rdpsndDevicePlugin*)aqPlugin);
	return 0;
}
Beispiel #4
0
int
FreeRDPRdpsndDeviceEntry(PFREERDP_RDPSND_DEVICE_ENTRY_POINTS pEntryPoints)
{
	rdpsndDevicePlugin * devplugin;
	struct alsa_device_data * alsa_data;
	RD_PLUGIN_DATA * data;
	int i;

	devplugin = pEntryPoints->pRegisterRdpsndDevice(pEntryPoints->plugin);
	if (devplugin == NULL)
	{
		LLOGLN(0, ("rdpsnd_alsa: unable to register device."));
		return 1;
	}

	devplugin->open = rdpsnd_alsa_open;
	devplugin->format_supported = rdpsnd_alsa_format_supported;
	devplugin->set_format = rdpsnd_alsa_set_format;
	devplugin->set_volume = rdpsnd_alsa_set_volume;
	devplugin->play = rdpsnd_alsa_play;
	devplugin->close = rdpsnd_alsa_close;
	devplugin->free = rdpsnd_alsa_free;

	alsa_data = (struct alsa_device_data *) malloc(sizeof(struct alsa_device_data));
	memset(alsa_data, 0, sizeof(struct alsa_device_data));

	data = (RD_PLUGIN_DATA *) pEntryPoints->data;
	if (data && strcmp(data->data[0], "alsa") == 0)
	{
		for (i = 1; i < 4 && data->data[i]; i++)
		{
			if (i > 1)
			{
				strncat(alsa_data->device_name, ":",
					sizeof(alsa_data->device_name) - strlen(alsa_data->device_name));
			}
			strncat(alsa_data->device_name, (char*)data->data[i],
				sizeof(alsa_data->device_name) - strlen(alsa_data->device_name));
		}
	}
	if (alsa_data->device_name[0] == '\0')
	{
		strcpy(alsa_data->device_name, "default");
	}
	alsa_data->out_handle = 0;
	alsa_data->source_rate = 22050;
	alsa_data->actual_rate = 22050;
	alsa_data->format = SND_PCM_FORMAT_S16_LE;
	alsa_data->source_channels = 2;
	alsa_data->actual_channels = 2;
	alsa_data->bytes_per_channel = 2;
	alsa_data->pResample = pEntryPoints->pResample;
	alsa_data->pDecodeImaAdpcm = pEntryPoints->pDecodeImaAdpcm;
	devplugin->device_data = alsa_data;

	LLOGLN(0, ("rdpsnd_alsa: alsa device '%s' registered.", alsa_data->device_name));

	return 0;
}
Beispiel #5
0
int FreeRDPRdpsndDeviceEntry(PFREERDP_RDPSND_DEVICE_ENTRY_POINTS pEntryPoints)
{
	rdpsndPulsePlugin* pulse;
	RDP_PLUGIN_DATA* data;

	pulse = xnew(rdpsndPulsePlugin);

	pulse->device.Open = rdpsnd_pulse_open;
	pulse->device.FormatSupported = rdpsnd_pulse_format_supported;
	pulse->device.SetFormat = rdpsnd_pulse_set_format;
	pulse->device.SetVolume = rdpsnd_pulse_set_volume;
	pulse->device.Play = rdpsnd_pulse_play;
	pulse->device.Start = rdpsnd_pulse_start;
	pulse->device.Close = rdpsnd_pulse_close;
	pulse->device.Free = rdpsnd_pulse_free;

	data = pEntryPoints->plugin_data;
	if (data && strcmp((char*)data->data[0], "pulse") == 0)
	{
		if(data->data[1] && strlen((char*)data->data[1]) > 0) 
			pulse->device_name = xstrdup((char*)data->data[1]);
		else
			pulse->device_name = NULL;
	}

	pulse->dsp_context = freerdp_dsp_context_new();

	pulse->mainloop = pa_threaded_mainloop_new();
	if (!pulse->mainloop)
	{
		DEBUG_WARN("pa_threaded_mainloop_new failed");
		rdpsnd_pulse_free((rdpsndDevicePlugin*)pulse);
		return 1;
	}
	pulse->context = pa_context_new(pa_threaded_mainloop_get_api(pulse->mainloop), "freerdp");
	if (!pulse->context)
	{
		DEBUG_WARN("pa_context_new failed");
		rdpsnd_pulse_free((rdpsndDevicePlugin*)pulse);
		return 1;
	}
	pa_context_set_state_callback(pulse->context, rdpsnd_pulse_context_state_callback, pulse);
	if (!rdpsnd_pulse_connect((rdpsndDevicePlugin*)pulse))
	{
		DEBUG_WARN("rdpsnd_pulse_connect failed");
		rdpsnd_pulse_free((rdpsndDevicePlugin*)pulse);
		return 1;
	}

	pEntryPoints->pRegisterRdpsndDevice(pEntryPoints->rdpsnd, (rdpsndDevicePlugin*)pulse);

	return 0;
}
Beispiel #6
0
int FreeRDPRdpsndDeviceEntry(PFREERDP_RDPSND_DEVICE_ENTRY_POINTS pEntryPoints) {
	rdpsndSlesPlugin* sles;

	sles = xnew(rdpsndSlesPlugin);

	//set callbacks
	sles->device.Open = rdpsnd_sles_open;
	sles->device.FormatSupported = rdpsnd_sles_format_supported;
	sles->device.SetFormat = rdpsnd_sles_set_format;
	sles->device.SetVolume = rdpsnd_sles_set_volume;
	sles->device.Play = rdpsnd_sles_play;
	sles->device.Start = rdpsnd_sles_start;
	sles->device.Close = rdpsnd_sles_close;
	sles->device.Free = rdpsnd_sles_free;

	pthread_mutex_init(&sles->mutex, NULL);

	SLresult result;
	//create sles engine to access all sles functions
	result = slCreateEngine(&sles->engineObjectItf, 0, NULL, 0, NULL, NULL);
	if (!checkError(result, "slCreateEngine")) return 1;
	result =(*sles->engineObjectItf)->Realize(sles->engineObjectItf, SL_BOOLEAN_FALSE);
	if (!checkError(result, "realize engine")) return 1;
	result = (*sles->engineObjectItf)->GetInterface(sles->engineObjectItf, SL_IID_ENGINE, &sles->engineItf);
	if (!checkError(result, "get interface engine")) return 1;
	//create outputmix to play on output of the device
	result = (*sles->engineItf)->CreateOutputMix(sles->engineItf, &sles->outputmixObjectItf, 0, NULL, NULL);
	if (!checkError(result, "create output mix")) return 1;
	result = (*sles->outputmixObjectItf)->Realize(sles->outputmixObjectItf, SL_BOOLEAN_FALSE);
	if (!checkError(result, "realize output mix")) return 1;
	//set output property to outpoutmix
	sles->outputmixLoc.locatorType = SL_DATALOCATOR_OUTPUTMIX;
	sles->outputmixLoc.outputMix = sles->outputmixObjectItf;
	//set input property to bufferqueue
	sles->bufferQueue.locatorType = SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE;
	sles->bufferQueue.numBuffers = (SLuint32)128;

	//register sles rdpsnd device
	pEntryPoints->pRegisterRdpsndDevice(pEntryPoints->rdpsnd, (rdpsndDevicePlugin*)sles);

	return 0;
}
Beispiel #7
0
int FreeRDPRdpsndDeviceEntry(PFREERDP_RDPSND_DEVICE_ENTRY_POINTS pEntryPoints)
{
    rdpsndAlsaPlugin* alsa;
    RDP_PLUGIN_DATA* data;

    alsa = xnew(rdpsndAlsaPlugin);

    alsa->device.Open = rdpsnd_alsa_open;
    alsa->device.FormatSupported = rdpsnd_alsa_format_supported;
    alsa->device.SetFormat = rdpsnd_alsa_set_format;
    alsa->device.SetVolume = rdpsnd_alsa_set_volume;
    alsa->device.Play = rdpsnd_alsa_play;
    alsa->device.Start = rdpsnd_alsa_start;
    alsa->device.Close = rdpsnd_alsa_close;
    alsa->device.Free = rdpsnd_alsa_free;

    data = pEntryPoints->plugin_data;
    if (data && strcmp((char*)data->data[0], "alsa") == 0)
    {
        alsa->device_name = xstrdup((char*)data->data[1]);
    }
    if (alsa->device_name == NULL)
    {
        alsa->device_name = xstrdup("default");
    }
    alsa->out_handle = 0;
    alsa->source_rate = 22050;
    alsa->actual_rate = 22050;
    alsa->format = SND_PCM_FORMAT_S16_LE;
    alsa->source_channels = 2;
    alsa->actual_channels = 2;
    alsa->bytes_per_channel = 2;

    pEntryPoints->pRegisterRdpsndDevice(pEntryPoints->rdpsnd, (rdpsndDevicePlugin*)alsa);

    return 0;
}
Beispiel #8
0
int
FreeRDPRdpsndDeviceEntry(PFREERDP_RDPSND_DEVICE_ENTRY_POINTS pEntryPoints)
{
	rdpsndDevicePlugin * devplugin;
	struct pulse_device_data * pulse_data;
	RD_PLUGIN_DATA * data;
	int i;

	devplugin = pEntryPoints->pRegisterRdpsndDevice(pEntryPoints->plugin);
	if (devplugin == NULL)
	{
		LLOGLN(0, ("rdpsnd_pulse: unable to register device."));
		return 1;
	}

	devplugin->open = rdpsnd_pulse_open;
	devplugin->format_supported = rdpsnd_pulse_format_supported;
	devplugin->set_format = rdpsnd_pulse_set_format;
	devplugin->set_volume = rdpsnd_pulse_set_volume;
	devplugin->play = rdpsnd_pulse_play;
	devplugin->close = rdpsnd_pulse_close;
	devplugin->free = rdpsnd_pulse_free;

	pulse_data = (struct pulse_device_data *) malloc(sizeof(struct pulse_device_data));
	memset(pulse_data, 0, sizeof(struct pulse_device_data));

	data = (RD_PLUGIN_DATA *) pEntryPoints->data;
	if (data && strcmp(data->data[0], "pulse") == 0)
	{
		for (i = 1; i < 4 && data->data[i]; i++)
		{
			if (i > 1)
			{
				strncat(pulse_data->device_name, ":",
					sizeof(pulse_data->device_name) - strlen(pulse_data->device_name));
			}
			strncat(pulse_data->device_name, (char*)data->data[i],
				sizeof(pulse_data->device_name) - strlen(pulse_data->device_name));
		}
	}
	pulse_data->pDecodeImaAdpcm = pEntryPoints->pDecodeImaAdpcm;
	devplugin->device_data = pulse_data;

	pulse_data->mainloop = pa_threaded_mainloop_new();
	if (!pulse_data->mainloop)
	{
		LLOGLN(0, ("rdpsnd_pulse: pa_threaded_mainloop_new failed"));
		rdpsnd_pulse_free(devplugin);
		return 1;
	}
	pulse_data->context = pa_context_new(pa_threaded_mainloop_get_api(pulse_data->mainloop), "freerdp");
	if (!pulse_data->context)
	{
		LLOGLN(0, ("rdpsnd_pulse: pa_context_new failed"));
		rdpsnd_pulse_free(devplugin);
		return 1;
	}
	pa_context_set_state_callback(pulse_data->context, rdpsnd_pulse_context_state_callback, devplugin);
	if (rdpsnd_pulse_connect(devplugin))
	{
		LLOGLN(0, ("rdpsnd_pulse: rdpsnd_pulse_connect failed"));
		rdpsnd_pulse_free(devplugin);
		return 1;
	}

	LLOGLN(0, ("rdpsnd_pulse: pulse device '%s' registered.", pulse_data->device_name));

	return 0;
}