Blame server/shadow/shadow_audin.c

Packit 1fb8d4
/**
Packit 1fb8d4
 * FreeRDP: A Remote Desktop Protocol Implementation
Packit 1fb8d4
 *
Packit 1fb8d4
 * Copyright 2015 Jiang Zihao <zihao.jiang@yahoo.com>
Packit 1fb8d4
 *
Packit 1fb8d4
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit 1fb8d4
 * you may not use this file except in compliance with the License.
Packit 1fb8d4
 * You may obtain a copy of the License at
Packit 1fb8d4
 *
Packit 1fb8d4
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit 1fb8d4
 *
Packit 1fb8d4
 * Unless required by applicable law or agreed to in writing, software
Packit 1fb8d4
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit 1fb8d4
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit 1fb8d4
 * See the License for the specific language governing permissions and
Packit 1fb8d4
 * limitations under the License.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
#ifdef HAVE_CONFIG_H
Packit 1fb8d4
#include "config.h"
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#include <freerdp/log.h>
Packit 1fb8d4
#include <freerdp/codec/dsp.h>
Packit 1fb8d4
#include "shadow.h"
Packit 1fb8d4
Packit 1fb8d4
#include "shadow_audin.h"
Packit 1fb8d4
#include <freerdp/server/server-common.h>
Packit 1fb8d4
Packit 1fb8d4
#define TAG SERVER_TAG("shadow")
Packit 1fb8d4
Packit 1fb8d4
/**
Packit 1fb8d4
 * Function description
Packit 1fb8d4
 *
Packit 1fb8d4
 * @return 0 on success, otherwise a Win32 error code
Packit 1fb8d4
 */
Packit 1fb8d4
static UINT AudinServerOpening(audin_server_context* context)
Packit 1fb8d4
{
Packit 1fb8d4
	AUDIO_FORMAT* agreed_format = NULL;
Packit 1fb8d4
	size_t i = 0, j = 0;
Packit 1fb8d4
Packit 1fb8d4
	for (i = 0; i < context->num_client_formats; i++)
Packit 1fb8d4
	{
Packit 1fb8d4
		for (j = 0; j < context->num_server_formats; j++)
Packit 1fb8d4
		{
Packit 1fb8d4
			if (audio_format_compatible(&context->server_formats[j], &context->client_formats[i]))
Packit 1fb8d4
			{
Packit 1fb8d4
				agreed_format = &context->server_formats[j];
Packit 1fb8d4
				break;
Packit 1fb8d4
			}
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		if (agreed_format != NULL)
Packit 1fb8d4
			break;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (agreed_format == NULL)
Packit 1fb8d4
	{
Packit 1fb8d4
		WLog_ERR(TAG, "Could not agree on a audio format with the server\n");
Packit 1fb8d4
		return CHANNEL_RC_OK;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return IFCALLRESULT(ERROR_CALL_NOT_IMPLEMENTED, context->SelectFormat, context, i);
Packit 1fb8d4
}
Packit 1fb8d4
/**
Packit 1fb8d4
 * Function description
Packit 1fb8d4
 *
Packit 1fb8d4
 * @return 0 on success, otherwise a Win32 error code
Packit 1fb8d4
 */
Packit 1fb8d4
static UINT AudinServerOpenResult(audin_server_context* context, UINT32 result)
Packit 1fb8d4
{
Packit 1fb8d4
	WLog_INFO(TAG, "AUDIN open result %"PRIu32".\n", result);
Packit 1fb8d4
	return CHANNEL_RC_OK;
Packit 1fb8d4
}
Packit 1fb8d4
/**
Packit 1fb8d4
 * Function description
Packit 1fb8d4
 *
Packit 1fb8d4
 * @return 0 on success, otherwise a Win32 error code
Packit 1fb8d4
 */
Packit 1fb8d4
static UINT AudinServerReceiveSamples(audin_server_context* context, const AUDIO_FORMAT* format,
Packit 1fb8d4
                                      wStream* buf, size_t nframes)
Packit 1fb8d4
{
Packit 1fb8d4
	rdpShadowClient* client = (rdpShadowClient*)context->data;
Packit 1fb8d4
	rdpShadowSubsystem* subsystem = client->server->subsystem;
Packit 1fb8d4
Packit 1fb8d4
	if (!client->mayInteract)
Packit 1fb8d4
		return CHANNEL_RC_OK;
Packit 1fb8d4
Packit 1fb8d4
	if (!IFCALLRESULT(TRUE, subsystem->AudinServerReceiveSamples, subsystem, client, format, buf,
Packit 1fb8d4
	                  nframes))
Packit 1fb8d4
		return ERROR_INTERNAL_ERROR;
Packit 1fb8d4
Packit 1fb8d4
	return CHANNEL_RC_OK;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL shadow_client_audin_init(rdpShadowClient* client)
Packit 1fb8d4
{
Packit 1fb8d4
	audin_server_context* audin;
Packit 1fb8d4
	audin = client->audin = audin_server_context_new(client->vcm);
Packit 1fb8d4
Packit 1fb8d4
	if (!audin)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	audin->data = client;
Packit 1fb8d4
Packit 1fb8d4
	if (client->subsystem->audinFormats)
Packit 1fb8d4
	{
Packit 1fb8d4
		size_t x;
Packit 1fb8d4
		audin->server_formats = audio_formats_new(client->subsystem->nAudinFormats);
Packit 1fb8d4
Packit 1fb8d4
		if (!audin->server_formats)
Packit 1fb8d4
			goto fail;
Packit 1fb8d4
Packit 1fb8d4
		for (x = 0; x < client->subsystem->nAudinFormats; x++)
Packit 1fb8d4
		{
Packit 1fb8d4
			if (!audio_format_copy(&client->subsystem->audinFormats[x], &audin->server_formats[x]))
Packit 1fb8d4
				goto fail;
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		audin->num_server_formats = client->subsystem->nAudinFormats;
Packit 1fb8d4
	}
Packit 1fb8d4
	else
Packit 1fb8d4
	{
Packit 1fb8d4
		audin->num_server_formats = server_audin_get_formats(&audin->server_formats);
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (audin->num_server_formats < 1)
Packit 1fb8d4
		goto fail;
Packit 1fb8d4
Packit 1fb8d4
	audin->dst_format = &audin->server_formats[0];
Packit 1fb8d4
	audin->Opening = AudinServerOpening;
Packit 1fb8d4
	audin->OpenResult = AudinServerOpenResult;
Packit 1fb8d4
	audin->ReceiveSamples = AudinServerReceiveSamples;
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
fail:
Packit 1fb8d4
	audin_server_context_free(audin);
Packit 1fb8d4
	client->audin = NULL;
Packit 1fb8d4
	return FALSE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
void shadow_client_audin_uninit(rdpShadowClient* client)
Packit 1fb8d4
{
Packit 1fb8d4
	if (client->audin)
Packit 1fb8d4
	{
Packit 1fb8d4
		audin_server_context_free(client->audin);
Packit 1fb8d4
		client->audin = NULL;
Packit 1fb8d4
	}
Packit 1fb8d4
}