Tôi có một mảng dữ liệu PCM, nó có thể là 16 bit, 24 bit đóng gói, 32 bit, vv .. Nó có thể được ký kết, hoặc unsigned, và nó có thể là điểm nổi 32 hoặc 64 bit. Nó hiện được lưu trữ dưới dạng ma trận "void **", được lập chỉ mục theo kênh, sau đó theo khung. Mục đích là để cho phép thư viện của tôi thực hiện bất kỳ định dạng PCM nào và đệm nó, mà không yêu cầu thao tác dữ liệu để phù hợp với cấu trúc được chỉ định. Nếu bộ chuyển đổi A/D phát ra các mảng được đóng gói 24 bit của PCM xen kẽ, tôi cần chấp nhận nó một cách duyên dáng. Tôi cũng cần hỗ trợ 16 bit không xen kẽ, cũng như bất kỳ hoán vị nào của các định dạng trên.Void * mảng đúc để nổi, int32, int16, vv
Tôi biết độ sâu bit và thông tin khác trong thời gian chạy và tôi đang cố gắng mã hiệu quả trong khi không sao chép mã. Những gì tôi cần là một cách hiệu quả để đúc ma trận, đưa dữ liệu PCM vào ma trận, và sau đó kéo nó ra sau.
Tôi có thể truyền ma trận đến int32_t, hoặc int16_t đối với PCM 32 và 16 bit tương ứng, có lẽ tôi sẽ lưu trữ PCM 24 bit trong một int32_t cho 32 bit, 8 bit hệ thống byte.
Có ai có thể giới thiệu cách tốt để đưa dữ liệu vào mảng này và kéo nó ra sau không? Tôi muốn tránh các đoạn mã lớn trông giống như:
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
...
Hạn chế: Tôi đang làm việc trong C/C++, không có mẫu, không RTTI, không STL. Hãy suy nghĩ được nhúng. Mọi thứ trở nên phức tạp hơn khi tôi phải chuyển sang DSP với 16 bit byte.
Có ai có bất kỳ macro hữu ích nào mà họ có thể sẵn sàng chia sẻ không?
Cảm ơn,
-Griff
Tôi đã có thể nghĩ rằng đây chính là mẫu vấn đề được cho là để giải quyết. Là "không có mẫu" điều một giới hạn của toolchain của bạn, một số hạn chế khác về dự án, hoặc chỉ là một sở thích cá nhân? –
Bạn làm gì với dữ liệu? Nó không rõ ràng từ các câu hỏi mà bạn thực sự cần phải làm đúc ở tất cả nếu tất cả các bạn làm là đệm dữ liệu thô và tay nó sau này. – Kylotan
@Anon, vì OP thậm chí không chấp nhận cú pháp sao chép được bảo vệ bởi nhánh có điều kiện, tôi có thể đoán được vấn đề kích thước thực thi đang tăng cờ đỏ trên các mẫu. (kể từ khi chức năng mẫu kết quả trong thực thi lớn hơn so với chuyển đổi ... trường hợp) – YeenFei