Преобразование массива Void * в значения с плавающей запятой, int32, int16 и т. Д.

У меня есть массив данных PCM, он может быть 16-битным, 24-битным, 32-битным и т. Д. Он может быть подписан или беззнаковый , и это может быть 32 или 64 бит с плавающей запятой. В настоящее время он хранится как матрица «void **», индексированная по каналам, а затем по кадрам. Цель состоит в том, чтобы позволить моей библиотеке принимать любой формат PCM и буферизовать его, не требуя манипулирования данными для соответствия указанной структуре. Если аналого-цифровой преобразователь выдает 24-битные упакованные массивы с чередованием PCM, мне нужно принять это изящно. Мне также нужно поддерживать 16-битное без чередования, а также любую перестановку вышеуказанных форматов.

Я знаю битовую глубину и другую информацию во время выполнения, и я пытаюсь кодировать эффективно, не дублируя код. Мне нужен эффективный способ преобразовать матрицу, поместить данные PCM в матрицу, а затем вытащить ее позже.

Я могу преобразовать матрицу в int32_t или int16_t для 32- и 16-битного PCM со знаком соответственно, я Возможно, придется хранить 24-битный PCM в int32_t для 32-битных, 8-битных систем.

Может ли кто-нибудь порекомендовать хороший способ поместить данные в этот массив и вытащить его позже? Я бы хотел избежать больших участков кода, которые выглядят так:

switch( mFormat )
{
case 1: // unsigned 8 bit
  for( int i = 0; i < mChannels; i++ )
    framesArray = (uint8_t*)pcm[i];
  break;
case 2: // signed 8 bit
  for( int i = 0; i < mChannels; i++ )
    framesArray = (int8_t*)pcm[i];
  break;
case 3: // unsigned 16 bit
...

Ограничения: Я работаю на C / C ++, без шаблонов, без RTTI, без STL. Думаю, встроено. Все становится еще сложнее, когда мне приходится переносить это на DSP с 16-битными байтами. общедоступный ActionResult Create (строка uniqueUri) {// получаем кое-что на основе uniqueuri, установленной в ViewData. return View () ...

У меня есть два следующих метода действий (упрощенные для вопроса):

[HttpGet]
public ActionResult Create(string uniqueUri)
{
   // get some stuff based on uniqueuri, set in ViewData.  
   return View();
}

[HttpPost]
public ActionResult Create(Review review)
{
   // validate review
   if (validatedOk)
   {
      return RedirectToAction("Details", new { postId = review.PostId});
   }  
   else
   {
      ModelState.AddModelError("ReviewErrors", "some error occured");
      return RedirectToAction("Create", new { uniqueUri = Request.RequestContext.RouteData.Values["uniqueUri"]});
   }   
}

Итак, если проверка проходит, я перенаправляюсь на другую страницу (подтверждение).

Если возникает ошибка, мне нужно отобразить ту же страницу с ошибкой.

Если я сделаю return View () , отобразится ошибка, но если я сделаю , верните RedirectToAction (как указано выше), он теряет ошибки модели.

Я не удивлен этой проблемой, просто интересно, как вы, ребята, справляетесь с этим?

Я, конечно, мог бы просто вернуть то же представление вместо перенаправления, но у меня есть логика в " Create », который заполняет данные представления, которые мне пришлось бы продублировать.

Есть предложения?

85
задан RPM1984 10 January 2011 в 00:45
поделиться