⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 audio.cpp

📁 2009 ROBOCUP 仿真2DSERVER 源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// -*-c++-*-/***************************************************************************                                   audio.cc                    Classes for building audio messages                             -------------------    begin                : 27-JAN-2002    copyright            : (C) 2002 by The RoboCup Soccer Server                           Maintenance Group.    email                : sserver-admin@lists.sourceforge.net***************************************************************************//*************************************************************************** *                                                                         * *   This program is free software; you can redistribute it and/or modify  * *   it under the terms of the GNU LGPL as published by the Free Software  * *   Foundation; either version 2 of the License, or (at your option) any  * *   later version.                                                        * *                                                                         * ***************************************************************************/#ifdef HAVE_CONFIG_H#include "config.h"#endif#include "audio.h"#include "clangmsg.h"#include "clangunsuppmsg.h"#include "coach.h"#include "field.h"#include "player.h"#include "random.h"#include "utility.h"#include "serializer.h"#include <rcssbase/factory.hpp>namespace rcss {voidListener::sendRefereeAudio( const char * msg ){    sender().sendRefereeAudio( msg );}voidListener::sendCoachAudio( const Coach & coach,                          const char * msg ){    sender().sendCoachAudio( coach, msg );}voidListener::sendCoachStdAudio( const rcss::clang::Msg & msg ){    sender().sendCoachStdAudio( msg );}voidListener::sendPlayerAudio( const Player & player,                           const char * msg ){    sender().sendPlayerAudio( player, msg );}voidListener::newCycle(){    sender().newCycle();}voidListener::focusOn( const Player & player ){    sender().focusOn( player );}voidListener::focusOff(){    sender().focusOff();}voidListener::setEar( bool on,                  Side side,                  bool complete,                  bool partial ){    sender().setEar( on, side, complete, partial );}voidListener::sendOKClang(){    sender().sendOKClang();}voidListener::sendErrorNoTeamName( const std::string & team_name ){    sender().sendErrorNoTeamName( team_name );}AudioSenderPlayer::FactoryHolder &AudioSenderPlayer::factory(){    static FactoryHolder rval;    return rval;}AudioSenderPlayer::AudioSenderPlayer( const Params & params )    : AudioSender( params.m_stadium,                   params.m_transport ),      M_listener( params.m_listener ),      M_serializer( params.m_serializer ){}AudioSenderPlayer::~AudioSenderPlayer(){    //std::cerr << "delete AudioSenderPlayer" << std::endl;}voidAudioSenderPlayer::sendPlayerAudio( const Player & player,                                    const char * msg ){    if ( &player == &M_listener )    {        sendSelfAudio( msg );    }    else    {        sendNonSelfPlayerAudio( player, msg );    }}boolAudioSenderPlayer::generalPredicate() const{    return M_listener.state() != DISABLE;}boolAudioSenderPlayer::coachStdPredicate( const rcss::clang::Msg & msg ) const{    return ( generalPredicate()             && M_listener.side() == msg.getSide() );}boolAudioSenderPlayer::nonSelfPlayerPredicate( const Player & player ) const{    // we could do this as one big return statement, but then it becomes    // a nightmare to understand    if( generalPredicate() )    {        if ( M_listener.canHearFullFrom( player )             && player.pos().distance( M_listener.pos() )             <= ServerParam::instance().audioCutDist() )        {            return true;        }//         if( player.pos().distance( M_listener.pos() )//             <= ServerParam::instance().audio_dist )//         {//             if ( M_listener.team() == player.team() )//             {//                 return ( M_listener.hear_capacity_from_teammate//                          >= (int)ServerParam::instance().hearDecay() );//             }//             else//             {//                 return ( M_listener.hear_capacity_from_opponent//                          >= (int)ServerParam::instance().hearDecay() );//            }//        }    }    return false;}boolAudioSenderPlayer::postNonSelfPlayer( const Player & player ){    M_listener.decrementHearCapacity( player );//     if ( M_listener.team() == player.team() )//         M_listener.hear_capacity_from_teammate//             -= ServerParam::instance().hearDecay();//     else//         M_listener.hear_capacity_from_opponent//             -= ServerParam::instance().hearDecay();    return true;}voidAudioSenderPlayerv1::sendRefereeAudio( const char * msg ){    if ( generalPredicate () )    {        M_serializer.serializeRefereeAudio( transport(), M_stadium.time(), msg );        transport() << std::ends << std::flush;    }}voidAudioSenderPlayerv1::sendCoachAudio( const Coach & coach,                                     const char * msg ){    if ( generalPredicate () )    {        std::string name;        switch( coach.side() ) {        case NEUTRAL:            name = REFEREE_NAME;            break;        case LEFT:            name = OLCOACH_NAME_L;            break;        case RIGHT:            name = OLCOACH_NAME_R;            break;        default:            // don't know what we have here so don't send anything            return;        }        M_serializer.serializeCoachAudio( transport(),                                          M_stadium.time(),                                          name,                                          msg );        transport() << std::ends << std::flush;    }}voidAudioSenderPlayerv1::sendCoachStdAudio( const rcss::clang::Msg & msg ){    if ( coachStdPredicate( msg ) )    {        std::string name;        switch( msg.getSide() ) {        case LEFT:            name = OLCOACH_NAME_L;            break;        case RIGHT:            name = OLCOACH_NAME_R;            break;        default:            // don't know what we have here so don't send anything            return;        }        if ( msg.isSupported( M_listener.clangMinVer(),                              M_listener.clangMaxVer() ) )        {            M_serializer.serializeCoachStdAudio( transport(),                                                 msg.getTimeSend(),                                                 name,                                                 msg );        }        else        {            M_serializer.serializeCoachStdAudio( transport(),                                                 msg.getTimeSend(),                                                 name,                                                 rcss::clang::UnsuppMsg() );        }        transport() << std::ends << std::flush;    }}voidAudioSenderPlayerv1::sendSelfAudio( const char * msg ){    if ( generalPredicate() )    {        M_serializer.serializeSelfAudio( transport(), M_stadium.time(), msg );        transport() << std::ends << std::flush;    }}voidAudioSenderPlayerv1::sendNonSelfPlayerAudio( const Player & player,                                             const char * msg ){    if ( nonSelfPlayerPredicate( player ) )    {        int dir = Rad2IDeg( M_listener.angleFromBody( player ) );        M_serializer.serializePlayerAudio( transport(),                                           M_stadium.time(),                                           dir,                                           msg );        transport() << std::ends << std::flush;        postNonSelfPlayer( player );    }}voidAudioSenderPlayerv1::sendOKClang(){    M_serializer.serializeOKClang( transport(),                                   M_listener.clangMinVer(),                                   M_listener.clangMaxVer() );    transport() << std::ends << std::flush;}voidAudioSenderPlayerv1::sendErrorNoTeamName( const std::string& team_name ){    M_serializer.serializeErrorNoTeamName( transport(), team_name );    transport() << std::ends << std::flush;}voidAudioSenderPlayerv7::sendCoachAudio( const Coach & coach,                                     const char * msg ){    if ( generalPredicate() )    {        std::string name;        switch ( coach.side() ) {        case NEUTRAL:            name = COACH_NAME;            break;        case LEFT:            name = OLCOACH_NAME_L;            break;        case RIGHT:            name = OLCOACH_NAME_R;            break;        default:            // don't know what we have hear so don't send anything            return;        }        M_serializer.serializeCoachAudio( transport(),                                          M_stadium.time(),                                          name,                                          msg );        transport() << std::ends << std::flush;    }}voidAudioSenderPlayerv7::sendNonSelfPlayerAudio( const Player & player,                                             const char * msg ){    if ( nonSelfPlayerPredicate( player ) )    {        int dir = Rad2IDegRound( M_listener.angleFromBody( player ) );        M_serializer.serializePlayerAudio( transport(),                                           M_stadium.time(),                                           dir,                                           msg );        transport() << std::ends << std::flush;        postNonSelfPlayer( player );    }}AudioSenderPlayerv8::~AudioSenderPlayerv8(){    for ( player_msg_cont_t::iterator i = M_player_msgs.begin();          i != M_player_msgs.end();          ++i )    {        free( i->second );        i->second = NULL;    }    M_player_msgs.clear();    for ( self_msg_cont_t::iterator i = M_self_msgs.begin();          i != M_self_msgs.end();         ++i )    {        free( *i );        *i = NULL;    }    M_self_msgs.clear();    for ( coach_msg_cont_t::iterator i = M_coach_msgs.begin();          i != M_coach_msgs.end();          ++i )    {        free( i->second );        i->second = NULL;    }    M_coach_msgs.clear();}boolAudioSenderPlayerv8::nonSelfPlayerPredicate( const Player & player ) const{    return ( generalPredicate()             && ( player.pos().distance( M_listener.pos() )                  <= ServerParam::instance().audioCutDist() ) );}boolAudioSenderPlayerv8::nonSelfPlayerFullPredicate( const Player & player ) const{    return M_listener.canHearFullFrom( player );//     if ( M_listener.team() == player.team() )//     {//         return ( M_listener.hear_capacity_from_teammate//                  >= (int)ServerParam::instance().hearDecay() );//     }//     else//     {//         return ( M_listener.hear_capacity_from_opponent//                  >= (int)ServerParam::instance().hearDecay() );//     }}voidAudioSenderPlayerv8::sendCoachAudio( const Coach & coach,                                     const char * msg ){    char * msg_copy = strdup( msg );    if ( msg_copy == NULL )    {        std::cerr << "Error:  could not alocate memory to cache coach audio message\n";    }    else    {        M_coach_msgs.push_back( coach_key_value_t( &coach,                                                   msg_copy ) );    }}voidAudioSenderPlayerv8::sendSelfAudio( const char * msg ){    char * msg_copy = strdup( msg );    if ( msg_copy == NULL )    {        std::cerr << "Error:  could not alocate memory to cache player's own audio message\n";    }    else    {        M_self_msgs.push_back( msg_copy );    }}voidAudioSenderPlayerv8::sendNonSelfPlayerAudio( const Player & player,                                             const char * msg ){    if ( ! nonSelfPlayerPredicate( player ) )    {        return;    }    if ( ! M_left_complete         && ! M_left_partial         && player.side() == LEFT )    {        // if ear off all, messages are never cached        return;    }    if ( ! M_right_complete         && ! M_right_partial         && player.side() == RIGHT )    {        // if ear off all, messages are never cached        return;    }    char * msg_copy = strdup( msg );    if ( msg_copy == NULL )    {        std::cerr << "Error:  could not alocate memory to cache player audio message\n";    }    else    {        M_player_msgs.insert( player_key_value_t( &player,                                                  msg_copy ) );    }}voidAudioSenderPlayerv8::newCycle(){    for ( coach_msg_cont_t::iterator i = M_coach_msgs.begin();          i != M_coach_msgs.end();          ++i )    {        sendCachedCoachAudio( *(i->first), i->second );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -