/**********************************************************************
 * LeechCraft - modular cross-platform feature rich internet client.
 * Copyright (C) 2006-2014  Georg Rudoy
 *
 * Boost Software License - Version 1.0 - August 17th, 2003
 *
 * Permission is hereby granted, free of charge, to any person or organization
 * obtaining a copy of the software and accompanying documentation covered by
 * this license (the "Software") to use, reproduce, display, distribute,
 * execute, and transmit the Software, and to prepare derivative works of the
 * Software, and to permit third-parties to whom the Software is furnished to
 * do so, all subject to the following:
 *
 * The copyright notices in the Software and this entire statement, including
 * the above license grant, this restriction and the following disclaimer,
 * must be included in all copies of the Software, in whole or in part, and
 * all derivative works of the Software, unless such copies or derivative
 * works are solely in the form of machine-executable object code generated by
 * a source language processor.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
 * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
 * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 **********************************************************************/

#include "mediacall.h"
#include <QAudioFormat>
#include <QtDebug>
#include <QXmppCallManager.h>
#include <QXmppRtpChannel.h>
#include "clientconnection.h"
#include "glooxaccount.h"

namespace LeechCraft
{
namespace Azoth
{
namespace Xoox
{
	MediaCall::MediaCall (GlooxAccount *acc, QXmppCall *call)
	: QObject (call)
	, Call_ (call)
	, Account_ (acc)
	{
		connect (Call_,
				SIGNAL (stateChanged (QXmppCall::State)),
				this,
				SLOT (handleStateChanged (QXmppCall::State)));
		connect (Call_,
				SIGNAL (audioModeChanged (QIODevice::OpenMode)),
				this,
				SIGNAL (audioModeChanged (QIODevice::OpenMode)));
	}

	IMediaCall::Direction MediaCall::GetDirection () const
	{
		switch (Call_->direction ())
		{
		case QXmppCall::IncomingDirection:
			return DIn;
		case QXmppCall::OutgoingDirection:
			return DOut;
		default:
			qWarning () << Q_FUNC_INFO
					<< "unknown direction"
					<< Call_->direction ();
			return DIn;
		}
	}

	QString MediaCall::GetSourceID () const
	{
		QString jid;
		QString var;
		ClientConnection::Split (Call_->jid (), &jid, &var);
		return Account_->GetAccountID () + '_' + jid;
	}

	void MediaCall::Accept ()
	{
		Call_->accept ();
	}

	void MediaCall::Hangup ()
	{
		Call_->hangup ();
	}

	QIODevice* MediaCall::GetAudioDevice ()
	{
		const auto& payload = Call_->audioChannel ()->payloadType ();
		qDebug () << "INFO" << payload.name () << payload.parameters ();
		qDebug () << payload.channels () << payload.clockrate ();
		return Call_->audioChannel ();
	}

	QAudioFormat MediaCall::GetAudioFormat ()
	{
		const auto& payload = Call_->audioChannel ()->payloadType ();
		QAudioFormat result;
		result.setFrequency (payload.clockrate ());
		result.setChannelCount (payload.channels ());
		result.setSampleSize (16);
		result.setCodec ("audio/pcm");
		result.setByteOrder (QAudioFormat::LittleEndian);
		result.setSampleType (QAudioFormat::SignedInt);
		return result;
	}

	QIODevice* MediaCall::GetVideoDevice ()
	{
		return 0;
	}

	void MediaCall::handleStateChanged (QXmppCall::State state)
	{
		emit stateChanged (static_cast<State> (state));
	}
}
}
}
