Changeset 4272:9dbff74050ba in roaraudio
- Timestamp:
- 08/28/10 01:05:51 (14 years ago)
- Branch:
- default
- Phase:
- public
- Location:
- roard
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
roard/include/streams.h
r4270 r4272 67 67 int window; 68 68 int parent_window; 69 int mt; 69 70 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; 72 74 }; 73 75 … … 162 164 int streams_set_map (int id, char * map, size_t len); 163 165 166 int streams_ltm_ctl (int id, int mt, int window, int cmd); 167 int streams_ltm_calc (int id, struct roar_audio_info * info, void * data, size_t len); 168 struct roar_stream_ltm * streams_lzm_get(int id, int mt, int window); 169 164 170 int streams_ctl (int id, int_least32_t cmd, void * data); 165 171 -
roard/req.c
r4255 r4272 809 809 return -1; 810 810 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; 811 822 default: 812 823 ROAR_WARN("req_on_set_stream_para(*): unsupported command version: %i, %i", d[0], d[1]); -
roard/streams.c
r4240 r4272 1022 1022 } 1023 1023 1024 int 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 1096 int 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 1155 struct roar_stream_ltm * streams_lzm_get(int id, int mt, int window); 1156 1157 1024 1158 int streams_ctl (int id, int_least32_t cmd, void * data) { 1025 1159 struct roar_stream_server * ss; … … 1201 1335 roar_buffer_free(bufbuf); 1202 1336 } 1337 1338 streams_ltm_calc(id, stream_info, outdata, outlen); 1203 1339 1204 1340 if ( streams_get_flag(id, ROAR_FLAG_ANTIECHO) ) {
Note: See TracChangeset
for help on using the changeset viewer.