// ATPDlg.cpp : Implementation file
//

#include "stdafx.h"
#include "RemoteTest.h"
#include "ATPDlg.h"
#include "RemoteTestDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define SAFE_DELETE(p)  { if(p) { delete (p);     (p)=NULL; } }
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }


// A function in CATPDirectSound to capture PC audio
BOOL	GetCaptureProc( void* pCaptureData, DWORD dwCaptureLength, BOOL isEnd, void* pParam );

// Capture unusual notice messages
static const UINT WM_ATPDLG_STOP_CAPTURE = RegisterWindowMessage(_T("RemoteTestATPDlgStopCapture"));

/////////////////////////////////////////////////////////////////////////////
// CATPDlg  dialog


CATPDlg::CATPDlg(CVAIBO *vaibo, CWnd* pParent /*=NULL*/)
	: CDialog(CATPDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CATPDlg)
	//}}AFX_DATA_INIT

	// Virtual AIBO
	m_vaibo = vaibo;

	m_isAudioInStart = false;	// AudioTP start flag
	m_isNetAudioStart = false;	// NetAudio start flag
	m_wavePlayingF = false;		// Wave data playing flag
	m_captureF = false;			// Capture flag

	// Voice data format
	m_nAudioTPMode = ATP8K_8BIT_MONO_MIX;		// For AudioTP
	m_nNetAudioMode = ATP8K_8BIT_MONO_MIX;		// For NetAudio

	m_pATPDirectSound = NULL;

}


void CATPDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CATPDlg)
	DDX_Control(pDX, IDC_COMBO_ATP2, m_comboNetAu);
	DDX_Control(pDX, IDC_COMBO_ATP, m_comboATP);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CATPDlg, CDialog)
	//{{AFX_MSG_MAP(CATPDlg)
	ON_BN_CLICKED(IDC_BTN_ATPREQ, OnBtnATPReq)
	ON_BN_CLICKED(IDC_BTN_ATPREQ2, OnBtnNetAudioReq)
	ON_BN_CLICKED(IDC_BTN_START, OnBtnATPStart)
	ON_BN_CLICKED(IDC_BTN_SEND, OnBtnNetAudioSend)
	ON_WM_DESTROY()
	ON_REGISTERED_MESSAGE(WM_ATPDLG_STOP_CAPTURE, OnMsgStopCapture)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CATPDlg message handlers

void CATPDlg::OnOK()
{
	CDialog::OnOK();
}

BOOL CATPDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	m_comboATP.SetCurSel( /*0*/m_nAudioTPMode );
	m_comboNetAu.SetCurSel( 1 );	// NetAudio is only mono-mix sound.

	CheckRadioButton( IDC_KUCHIPAKU_ON, IDC_KUCHIPAKU_OFF, IDC_KUCHIPAKU_ON );


	m_pATPDirectSound = new CATPDirectSound();
	m_pATPDirectSound->Init( GetSafeHwnd() );

	return TRUE;   // return TRUE  unless you set the focus to a control
}

void CATPDlg::OnDestroy()
{
	CDialog::OnDestroy();

	if ( m_pATPDirectSound ) {
		SAFE_DELETE( m_pATPDirectSound );
	}
}


void CATPDlg::OnBtnATPReq()
{
	// Get the audio format.
	m_nAudioTPMode = m_comboATP.GetCurSel();

	// Required command in VAIBO to start receiving audio
	if ( m_vaibo->AudioGetOpen( m_nAudioTPMode ) != AUDIOTP_NOERROR ) {
		return;
	}
	if ( !m_vaibo->RequestNetService( AUDIO_IN_ID ) ) {
		return;
	}
}

void CATPDlg::OnBtnNetAudioReq()
{
	// Get the audio format
	int nSelCombo = m_comboNetAu.GetCurSel();
	if ( nSelCombo == 1 ) {
		m_nNetAudioMode = ATP8K_8BIT_MONO_MIX;
	} else if ( nSelCombo == 0 ) {
		m_nNetAudioMode = ATP16K_16BIT_MONO_MIX;
	} else {
		AfxMessageBox( "Invalid Data" );
		return;
	}


	// Required command in VAIBO to start receiving audio
	if ( m_vaibo->AudioSendOpen( m_nNetAudioMode ) != AUDIOTP_NOERROR ) {
		return;
	}
	if ( !m_vaibo->RequestNetService( NETAUDIO_ID ) ) {
		return;
	}
}

void CATPDlg::OnBtnATPStart()
{
	CString		strBtn;

	// "Receipt" button
	if ( !m_wavePlayingF ) {

		// Get the audio format.
		m_nAudioTPMode = m_comboATP.GetCurSel();

		// Send the audio format.
		m_vaibo->SendCmd( APPCMD_AUDIO_RECV_MODE, true, m_nAudioTPMode );

		// Start playing the recorded sounds from AIBO
		m_pATPDirectSound->StartPlay( m_nAudioTPMode );

		// Turn on the playing flag during reproduction.
		m_wavePlayingF = true;

		// Command to start receiving audio data
		m_vaibo->SendCmd( APPCMD_AUDIO_RECV_START );

		// Change the button text
		strBtn.LoadString( IDS_ATP_STOP );			// "Stop"
		buttonStart().SetWindowText( strBtn );

		// Disable switching.
		m_comboATP.EnableWindow( false );

	}
	// "Stop" button
	else {

		// Command to stop receiving audio data
		m_vaibo->SendCmd( APPCMD_AUDIO_RECV_STOP );

		// Stop audio reproduction
		m_pATPDirectSound->EndPlay();

		// Turn off the playing flag.
		m_wavePlayingF = false;

		// Change the button text
		strBtn.LoadString( IDS_ATP_RECV_START );	// "Receive"
		buttonStart().SetWindowText( strBtn );

		// Enable switching.
		m_comboATP.EnableWindow( true );

	}
}

// NetAudio "transmission" button
void CATPDlg::OnBtnNetAudioSend()
{
	CString		strBtn;

	// "Transmission" button
	if ( !m_captureF ) {

		// Set the automatic mouth movement flag.
		bool	isKuchipaku;
		switch ( GetCheckedRadioButton( IDC_KUCHIPAKU_ON, IDC_KUCHIPAKU_OFF ) ) {
			case IDC_KUCHIPAKU_ON:
				isKuchipaku = true;
				break;
			case IDC_KUCHIPAKU_OFF:
			default:
				isKuchipaku = false;
				break;
		}

		// Get the audio format.
		int nSelCombo = m_comboNetAu.GetCurSel();
		if ( nSelCombo == 1 ) {
			m_nNetAudioMode = ATP8K_8BIT_MONO_MIX;
		} else if ( nSelCombo == 0 ) {
			m_nNetAudioMode = ATP16K_16BIT_MONO_MIX;
		} else {
			AfxMessageBox( "Invalid Data" );
			return;
		}


		// Set the reproduced audio format
		m_vaibo->AudioSendSetMode( m_nNetAudioMode );

		// Audio reproduction start command
		m_vaibo->AudioSendPlay( isKuchipaku );

		// Start capturing PC audio
		m_pATPDirectSound->StartCapture( m_nNetAudioMode, GetCaptureProc, this );
		m_captureF = true;

		// Change the button text
		strBtn.LoadString( IDS_ATP_STOP );			// "Stop"
		buttonSend().SetWindowText( strBtn );
		GetDlgItem( IDC_KUCHIPAKU_ON )->EnableWindow( false );
		GetDlgItem( IDC_KUCHIPAKU_OFF )->EnableWindow( false );

		// Disable switching.
		m_comboNetAu.EnableWindow( false );

	}
	// "Stop" button
	else {
		// Stop capturing PC audio
		m_pATPDirectSound->EndCapture();
		m_captureF = false;

		// Audio reproduction stop command
		m_vaibo->AudioSendStop();

		// Change the button text
		strBtn.LoadString( IDS_ATP_SEND_START );	// "Transmit"
		buttonSend().SetWindowText( strBtn );
		GetDlgItem( IDC_KUCHIPAKU_ON )->EnableWindow( true );
		GetDlgItem( IDC_KUCHIPAKU_OFF )->EnableWindow( true );

		// Enable switching.
		m_comboNetAu.EnableWindow( true );

	}
}


// This function is called at the start and end of the AudioTP service
void CATPDlg::StartAudioTP( BOOL bStart )
{
	if ( bStart ) {

		m_isAudioInStart = true;
		buttonStart().EnableWindow();
	}
	else {

		m_isAudioInStart = false;

		buttonStart().EnableWindow( false );
		m_comboATP.EnableWindow();
	}
}


// This function is called at the start and end of the NetAudio service
void CATPDlg::StartNetAudio( BOOL bStart )
{
	if ( bStart ) {

		m_isNetAudioStart = true;
		buttonSend().EnableWindow();
	}
	else {

		m_isNetAudioStart = false;

		buttonSend().EnableWindow( false );
		m_comboNetAu.EnableWindow();
	}
}

// Stop capture notice
LRESULT CATPDlg::OnMsgStopCapture( WPARAM wParam, LPARAM lParam )
{
	// Stop capturing PC audio
	m_pATPDirectSound->EndCapture();
	m_captureF = false;

	// Change the button text
	CString		strBtn;
	strBtn.LoadString( IDS_ATP_SEND_START );	// "Transmit"
	buttonSend().SetWindowText( strBtn );
	GetDlgItem( IDC_KUCHIPAKU_ON )->EnableWindow( true );
	GetDlgItem( IDC_KUCHIPAKU_OFF )->EnableWindow( true );

	// Enable switching.
	m_comboNetAu.EnableWindow( true );

	return S_OK;
}

// A function in CATPDirectSound to capture PC audio
BOOL	GetCaptureProc( void* pCaptureData, DWORD dwCaptureLength, BOOL isEnd, void* pParam )
{
	CATPDlg*	pATPDlg = ( CATPDlg* )pParam;
	CVAIBO*	pVaibo = pATPDlg->m_vaibo;

	// Transmission
	if ( pVaibo->AudioSendData( ( char* )pCaptureData, dwCaptureLength ) != AUDIOTP_NOERROR ) {
		// An unusual occurrence (must return management without locking)
		::PostMessage( pATPDlg->m_hWnd, WM_ATPDLG_STOP_CAPTURE, 0, 0 );
		return false;
	}

	return true;
}


// Reproduce Wave data. (called when Wave data is received)
void CATPDlg::OutputWaveData( unsigned char *buff, int size )
{
	// reproduce audio data
	if ( m_pATPDirectSound ) {
		// Transmit
		m_pATPDirectSound->PlayWaveData( ( char* )buff, size );
	}
}

