Changeset 4277:3d2c02fc7a50 in roaraudio


Ignore:
Timestamp:
08/28/10 19:26:29 (14 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

added support to read LTM data from the server

File:
1 edited

Legend:

Unmodified
Added
Removed
  • roard/req.c

    r4273 r4277  
    668668 struct roar_stream_server * ss; 
    669669 struct roar_audio_info * audio_info; 
    670  uint16_t * d = (uint16_t *) mes->data; 
    671  int i; 
     670 struct roar_stream_ltm * ltm; 
     671 uint16_t * d  = (uint16_t *) mes->data; 
     672 int64_t * d64 = ( int64_t *) mes->data; 
     673 int64_t * d64ptr; 
     674 int i, h, k; 
    672675 char * str; 
     676 size_t needed; 
     677 int test, bits; 
    673678 
    674679 if ( mes->datalen != 4 ) 
     
    755760   break; 
    756761 
     762  case ROAR_STREAM_PARA_LTM: 
     763    if ( mes->datalen < (6 * 2) ) 
     764     return -1; 
     765 
     766    for (i = 2; i < mes->datalen/2; i++) { 
     767     d[i] = ROAR_NET2HOST16(d[i]); 
     768    } 
     769 
     770    if ( d[2] != ROAR_LTM_SST_GET_RAW ) 
     771     return -1; 
     772 
     773    test = d[5]; 
     774    bits = 0; 
     775    while (test) { 
     776     if ( test & 0x1 ) 
     777      bits++; 
     778 
     779     test >>= 1; 
     780    } 
     781 
     782    needed = 0; 
     783 
     784    if ( mes->stream == -1 ) { 
     785     for (i = 6; i < mes->datalen/2; i++) { 
     786      if ( (ltm = streams_lzm_get(d[i], d[5], d[3])) == NULL ) 
     787       return -1; 
     788 
     789      needed += ltm->channels; 
     790     } 
     791    } else { 
     792     if ( (ltm = streams_lzm_get(mes->stream, d[5], d[3])) == NULL ) 
     793      return -1; 
     794 
     795     needed = ltm->channels; 
     796    } 
     797 
     798    needed *= bits; 
     799 
     800    needed += mes->stream == -1 ? (mes->datalen/2) - 6 : 1; 
     801    needed += 2; // header 
     802 
     803    if ( needed > LIBROAR_BUFFER_MSGDATA ) { 
     804     return -1; 
     805     if ( (d64 = malloc(needed*8)) == NULL ) 
     806      return -1; 
     807 
     808     *data = (char*)d64; 
     809    } 
     810 
     811    d64 = (int64_t*)mes->data; 
     812 
     813    if ( (d = roar_mm_malloc(mes->datalen)) == NULL ) 
     814     return -1; 
     815 
     816    memcpy(d, mes->data, mes->datalen); 
     817 
     818    // TODO: copy requested data over 
     819    d64[0] = 0; 
     820    d64[1] = 0; 
     821 
     822    d64ptr = &(d64[2]); 
     823 
     824    if ( mes->stream == -1 ) { 
     825     for (i = 6; i < mes->datalen/2; i++) { 
     826      if ( (ltm = streams_lzm_get(d[i], d[5], d[3])) == NULL ) 
     827       return -1; 
     828 
     829      *d64ptr = ltm->channels & 0xFFFF; 
     830       d64ptr++; 
     831 
     832      for (h = 0; h < ltm->channels; h++) { 
     833       for (k = 0; k < ROAR_LTM_MTBITS; k++) { 
     834        if ( d[5] & (1<<k) ) { 
     835         switch (1<<k) { 
     836          case ROAR_LTM_MT_RMS: 
     837            *d64ptr = ltm->cur[h].rms; 
     838           break; 
     839          default: 
     840            ROAR_ERR("req_on_get_stream_para(client=%i, ...): client requets unknown MT for LTM: bit %i", client, k); 
     841         } 
     842         d64ptr++; 
     843        } 
     844       } 
     845      } 
     846     } 
     847    } else { 
     848     if ( (ltm = streams_lzm_get(mes->stream, d[5], d[3])) == NULL ) 
     849      return -1; 
     850 
     851     *d64ptr = ltm->channels & 0xFFFF; 
     852      d64ptr++; 
     853 
     854     for (h = 0; h < ltm->channels; h++) { 
     855      for (k = 0; k < ROAR_LTM_MTBITS; k++) { 
     856       if ( d[5] & (1<<k) ) { 
     857        switch (1<<k) { 
     858         case ROAR_LTM_MT_RMS: 
     859           *d64ptr = ltm->cur[h].rms; 
     860          break; 
     861         default: 
     862           ROAR_ERR("req_on_get_stream_para(client=%i, ...): client requets unknown MT for LTM: bit %i", client, k); 
     863        } 
     864        d64ptr++; 
     865       } 
     866      } 
     867     } 
     868    } 
     869 
     870    roar_mm_free(d); 
     871 
     872    for (i = 0; i < needed; i++) { 
     873     d64[i] = ROAR_HOST2NET64(d64[i]); 
     874    } 
     875 
     876    mes->datalen = needed * 8; 
     877   break; 
     878 
    757879  default: 
    758880    ROAR_WARN("req_on_get_stream_para(*): unsupported command: %i", d[1]); 
     
    810932   break; 
    811933  case ROAR_STREAM_PARA_LTM: 
     934    if ( mes->datalen < (6 * 2) ) 
     935     return -1; 
     936 
    812937    for (i = 2; i < mes->datalen/2; i++) { 
    813938     d[i] = ROAR_NET2HOST16(d[i]); 
     
    815940 
    816941    if ( mes->stream == -1 ) { 
    817      return -1; 
    818  
    819942     for (i = 6; i < mes->datalen/2; i++) 
    820943      if ( streams_ltm_ctl(d[i], d[5], d[3], d[2]) == -1 ) 
Note: See TracChangeset for help on using the changeset viewer.