Changeset 4272:9dbff74050ba in roaraudio


Ignore:
Timestamp:
08/28/10 01:05:51 (14 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

support to reg and unreg for LTM :))

Location:
roard
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • roard/include/streams.h

    r4270 r4272  
    6767 int window; 
    6868 int parent_window; 
     69 int mt; 
    6970 size_t refc; 
    70  struct roar_ltm_vals cur; 
    71  struct roar_ltm_vals * history; 
     71 size_t channels; 
     72 struct roar_ltm_vals *  cur; 
     73 struct roar_ltm_vals ** history; 
    7274}; 
    7375 
     
    162164int streams_set_map      (int id, char * map, size_t len); 
    163165 
     166int streams_ltm_ctl      (int id, int mt, int window, int cmd); 
     167int streams_ltm_calc     (int id, struct roar_audio_info * info, void * data, size_t len); 
     168struct roar_stream_ltm * streams_lzm_get(int id, int mt, int window); 
     169 
    164170int streams_ctl          (int id, int_least32_t cmd, void * data); 
    165171 
  • roard/req.c

    r4255 r4272  
    809809     return -1; 
    810810   break; 
     811  case ROAR_STREAM_PARA_LTM: 
     812    if ( mes->stream == -1 ) 
     813     return -1; 
     814 
     815    for (i = 2; i < mes->datalen/2; i++) { 
     816     d[i] = ROAR_NET2HOST16(d[i]); 
     817    } 
     818 
     819    if ( streams_ltm_ctl(mes->stream, d[5], d[3], d[2]) == -1 ) 
     820     return -1; 
     821   break; 
    811822  default: 
    812823    ROAR_WARN("req_on_set_stream_para(*): unsupported command version: %i, %i", d[0], d[1]); 
  • roard/streams.c

    r4240 r4272  
    10221022} 
    10231023 
     1024int streams_ltm_ctl      (int id, int mt, int window, int cmd) { 
     1025 struct roar_stream_server * ss; 
     1026 struct roar_stream_ltm *    ltm; 
     1027 int i; 
     1028 
     1029 _CHECK_SID(id); 
     1030 
     1031 // currently we only support the WORKBLOCK window 
     1032 if ( window != ROAR_LTM_WIN_WORKBLOCK ) 
     1033  return -1; 
     1034 
     1035 // currently we only support ROAR_LTM_MT_RMS 
     1036 if ( (mt | ROAR_LTM_MT_RMS) - ROAR_LTM_MT_RMS ) 
     1037  return -1; 
     1038 
     1039 if ( (ss = g_streams[id]) == NULL ) 
     1040  return -1; 
     1041 
     1042 switch (cmd) { 
     1043  case ROAR_LTM_SST_NOOP: 
     1044    return 0; 
     1045   break; 
     1046  case ROAR_LTM_SST_REGISTER: 
     1047    // test if the window is already registered: 
     1048    for (i = 0; i < MAX_LTM_WINDOWS_PER_STREAM; i++) { 
     1049     ltm = &(ss->ltm[i]); 
     1050     if ( ltm->refc && ltm->window == window ) { 
     1051      ltm->refc++; 
     1052      ltm->mt |= mt; 
     1053      return 0; 
     1054     } 
     1055    } 
     1056 
     1057    // register 
     1058    for (i = 0; i < MAX_LTM_WINDOWS_PER_STREAM; i++) { 
     1059     ltm = &(ss->ltm[i]); 
     1060     if ( ltm->refc == 0 ) { 
     1061      memset(ltm, 0, sizeof(struct roar_stream_ltm)); 
     1062      ltm->refc = 1; 
     1063      ltm->window = window; 
     1064      ltm->parent_window = -1; 
     1065      ltm->mt = mt; 
     1066      ltm->channels = ROAR_STREAM(ss)->info.channels; 
     1067      if ( (ltm->cur = roar_mm_malloc(ltm->channels*sizeof(struct roar_ltm_vals))) == NULL ) { 
     1068       ltm->refc = 0; // reset 
     1069       return -1; 
     1070      } 
     1071      memset(ltm->cur, 0, ltm->channels*sizeof(struct roar_ltm_vals)); 
     1072      return 0; 
     1073     } 
     1074    } 
     1075    return -1; 
     1076   break; 
     1077  case ROAR_LTM_SST_UNREGISTER: 
     1078    for (i = 0; i < MAX_LTM_WINDOWS_PER_STREAM; i++) { 
     1079     ltm = &(ss->ltm[i]); 
     1080     if ( ltm->refc && ltm->window == window ) { 
     1081      ltm->refc--; 
     1082      if ( ! ltm->refc ) { 
     1083       roar_mm_free(ltm->cur); 
     1084       return 0; 
     1085      } 
     1086     } 
     1087    } 
     1088    return -1; 
     1089   break; 
     1090  default: 
     1091    return -1; 
     1092   break; 
     1093 } 
     1094} 
     1095 
     1096int streams_ltm_calc     (int id, struct roar_audio_info * info, void * data, size_t len) { 
     1097 struct roar_stream_server * ss; 
     1098 struct roar_stream_ltm *    ltm = NULL; 
     1099 int64_t rmsbuf_real[8]; 
     1100 int64_t * rmsbuf = rmsbuf_real; 
     1101 size_t samples = 0; 
     1102 int i; 
     1103 
     1104 _CHECK_SID(id); 
     1105 
     1106 if ( data == NULL || info == NULL ) 
     1107  return -1; 
     1108 
     1109 if ( info->codec != ROAR_CODEC_DEFAULT ) 
     1110  return -1; 
     1111 
     1112 if ( (ss = g_streams[id]) == NULL ) 
     1113  return -1; 
     1114 
     1115 for (i = 0; i < MAX_LTM_WINDOWS_PER_STREAM; i++) { 
     1116  if ( ss->ltm[i].refc && ss->ltm[i].window == ROAR_LTM_WIN_WORKBLOCK ) { 
     1117   ltm = &(ss->ltm[i]); 
     1118   break; 
     1119  } 
     1120 } 
     1121 
     1122 if ( ltm == NULL ) 
     1123  return -1; 
     1124 
     1125 // TODO: support change of number of channels 
     1126 if ( ltm->channels != info->channels ) 
     1127  return -1; 
     1128 
     1129 if ( len == 0 ) { 
     1130  memset(ltm->cur, 0, ltm->channels * sizeof(struct roar_ltm_vals)); 
     1131  return 0; 
     1132 } 
     1133 
     1134 // TODO: support more channels then rmsbuf_real has space for 
     1135 if ( ltm->channels > (sizeof(rmsbuf_real)/sizeof(*rmsbuf_real)) ) { 
     1136  return -1; 
     1137 } 
     1138 
     1139 samples = len / info->bits; 
     1140 
     1141 if ( ltm->mt & ROAR_LTM_MT_RMS ) { 
     1142  if ( roar_rms2_1_b_n(data, samples, rmsbuf, ltm->channels, info->bits) == -1 ) 
     1143   return -1; 
     1144 
     1145  for (i = 0; i < ltm->channels; i++) { 
     1146   ltm->cur[i].rms = rmsbuf[i]; 
     1147  } 
     1148 
     1149  ROAR_DBG("streams_ltm_calc(id=%i,...): rmsbuf[0]=%lli", id, (long long int)rmsbuf[0]); 
     1150 } 
     1151 
     1152 return 0; 
     1153} 
     1154 
     1155struct roar_stream_ltm * streams_lzm_get(int id, int mt, int window); 
     1156 
     1157 
    10241158int streams_ctl          (int id, int_least32_t cmd, void * data) { 
    10251159 struct roar_stream_server * ss; 
     
    12011335  roar_buffer_free(bufbuf); 
    12021336 } 
     1337 
     1338 streams_ltm_calc(id, stream_info, outdata, outlen); 
    12031339 
    12041340 if ( streams_get_flag(id, ROAR_FLAG_ANTIECHO) ) { 
Note: See TracChangeset for help on using the changeset viewer.