www.gusucode.com > 嵌入式linux系统的网络编程源码程序 > 嵌入式linux系统的网络编程源码程序/视频会议源码/audio_cap_thread.cpp

    ///////////////////////////////////////////////////////
// FileName:	audio_cap_thread.cpp
// Author:		b1gm0use
// Project:		myaudio

#include <iostream>

#include "network.h"
#include "audio_cap_thread.h"
#include "common.h"
#include "audio_cap.h"
#include "network_audio_send.h"
#include "audio_send.h"
#include "avi.h"

using namespace std;


///////////////////////////////////////////////////////
// Public Functions
///////////////////////////////////////////////////////

// 构造函数
// 传入参数为
// ap_in 上层AudioPlayer对象指针
// stackSize QThread所用的参数
audio_cap_thread::audio_cap_thread ( avi * avi_ptr_in, AudioPlayer * ap_in, unsigned int stackSize )
		:QThread( stackSize ) // {{{
{
	verbose_output( 2, "create audio_cap_thread." );

	ap = ap_in;
	ns = NULL;
	as = NULL;
	avi_ptr = avi_ptr_in;

} // }}}

audio_cap_thread::~audio_cap_thread ( void ) // {{{
{

	delete as;
	delete ns;

} // }}}


// 运行部分,线程代码在这里
void audio_cap_thread::run ( void ) // {{{
{

	int size = 0;
	
	BUFF * image = NULL;

	audio_cap * ac = NULL;

	verbose_output( 1, "running new audio_cap_thread." );

	// 如果是standalone会创建一个audio_cap对象
	// 如果是listen会再创建一个network_send对象

	ac = new audio_cap( avi_ptr );
	ac->init();

	if ( avi_ptr->net_mode == LISTEN )
	{
		verbose_output( 3, "net_mode LISTEN" );

		ns = new network_audio_send( avi_ptr );
		ns->init();
	}

	// 创建audio_send对象,用于向主体发送捕捉完毕信号
	if ( avi_ptr->net_mode == STANDALONE )
	{
		as = new audio_send;
		as->init( ap );
	}

	verbose_output( 1, "begin audio capture loop." );

	while ( 1 )
	{	


		// 取得一帧
		if ( ac->get_image ( image, &size ) == FAILED )
		{
			cerr << "Warning! get image error" << endl;
			continue;
		}

		if ( image == NULL )
		{
			cerr << "Can't get new audio frame" << endl;
			::exit( 1 );
		}

		// 发出信号
		if ( avi_ptr->net_mode == STANDALONE )
		{
			as->send_image( image, size );
		}

		// 如果做为listen方,则向其它connect方传送图像
		if ( avi_ptr->net_mode == LISTEN )
		{
			ns->send_image( image, size );
		}

	}

	return ;

} // }}}