Форум программистов, компьютерный форум CyberForum.ru

Преобразование Raw-данных в AIFF - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Потокобезопасная очередь: критика реализации http://www.cyberforum.ru/cpp/thread1525177.html
Прочитал третью часть "Уильямс Э. "Параллельное программирование на С++ в действии. Практика разработки многопоточных программ" - 2012" увидел там пример реализации потокобезопасной очереди, но к своему удивлению пример реализации основан на блокировании всей очереди. Погуглив увидел те же примеры с блокированием всего контейнера. KfcQJzusTps#t=2988 Собственно вероятно можно реализовать с...
C++ Вывод вектора (STL) справа налево Подскажите как вывести вектор начиная с его последнего элемента? for (vector<char>::iterator _pos = buffer.end() - 1; _pos >= buffer.begin(); --_pos) cout << *_pos; Так пробую при выполнении программы assert в файле vector в 130-й строке. http://www.cyberforum.ru/cpp/thread1525152.html
C++ Метод Шелла
Ошибка после сортировки методом Шелла. По примеру сайта http://kvodo.ru/sortirovka-shella.html В чем ошибка? #include "stdafx.h" #include "math.h" #include <iostream> #include <iomanip> #include <ctime>
C++ 64 bit double to 80 bit
Есть double переменная надо сделать из неё 80 - битную переменную, в интернете нашёл только этот асмовский код но он не работает. void ConvertDoubleToLongDouble(double value, unsigned char result) { __asm { fld value; mov ebx, result; fstp tbyte ptr ; } } вот такая ошибка на последней строчке выскакивает:
C++ Контроль корректности при приведении типа указателя http://www.cyberforum.ru/cpp/thread1525147.html
Требуется максимально корректно проверить, что переменная типа viod* содержит указатель на объект некоторого класса TDerived, являющегося наследником класса TObject. Один из вариантов это сделать: bool IsDerived(void * p, TDerived*& pDerived) { if (!p) return false; TObject* pObj = reinterpret_cast<TObject*>p;
C++ Построить бинарное дерево поиска получающееся в результате вставки ключевых слов Пусть в узлах дерева находятся символьные стро ки. Постройте бинарное дерево поиска, которое получается в результате вставки следующих ключе-вых слов: for, case, while, class, protected, virtual, public, private, do, template, const, if, int. Осуществите прохождение этого дерева симметричным методом. УКАЗАНИЕ. Для сравнения символьных строк в методах класса Bin-STree необходимо, чтобы... подробнее

Показать сообщение отдельно
emmure
2 / 2 / 0
Регистрация: 15.12.2012
Сообщений: 93
05.09.2015, 16:37     Преобразование Raw-данных в AIFF
Пытаюсь считать Raw дату, и сформировать из него AIFF файл с заголовком и датой. Тоже самое делал с WAV, получилось. Методы по сути брал оттуда, так что скорее всего проблема в структуре заголовка
aiff.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#ifndef AIFF_H
#define AIFF_H
#include <fstream>
#include <vector>
class AIFF
{
protected:
    //Form chunk
    char chunkId[4];
    unsigned long chunkSize;
    char formType[4];
    //COMM chunk
    char chunk2Id[4];
    unsigned long chunk2Size;
    unsigned short numChannels;
    unsigned long numSampleFrames;
    unsigned short sampleSize;
    unsigned char sampleRate[10];
 
    //SSND chunk
    char chunk3ID[4];
    unsigned long chunk3Size;
    unsigned long offset;
    unsigned long blockSize;
    //soundData
    std::vector <long> data;
 
public:
    AIFF();
    void add_by(FILE *file_in);
    void out(FILE *file_out);
    void cutoff(FILE *file_out);
};
 
#endif // AIFF_H

aiff.cpp
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include "aiff.h"
void ConvertDoubleToLongDouble(double value, unsigned char result[10])  //convert 64-bit to 80-bit
{
    __asm {
        fld value;
        mov ebx, result;
        fstp tbyte ptr[ebx];
    }
}
AIFF::AIFF()
{
 
    chunkId[0] = 'F'; chunkId[1] = 'O'; chunkId[2] = 'R'; chunkId[3] = 'M';
    chunkSize = 46;
    formType[0] = 'A'; formType[1] = 'I'; formType[2] = 'F'; formType[3] = 'F';
    chunk2Id[0] = 'C'; chunk2Id[1] = 'O'; chunk2Id[2] = 'M'; chunk2Id[3] = 'M';
    chunk2Size = 18;
    numChannels = 2;
    numSampleFrames = 88200;
    sampleSize = 16;
    //convert 64-bit to 80-bit
    double value = 44100;
    ConvertDoubleToLongDouble(value, sampleRate); //sampleRate1 = 44100
    //
    chunk3ID[0] = 'S'; chunk3ID[1] = 'S'; chunk3ID[2] = 'N'; chunk3ID[3] = 'D';
    chunk3Size = 8;
    offset = 0;
    blockSize = 0;
}
 
void AIFF::add_by(FILE *file_in)//метод считывает по попарно 2 переменные по 2 байта(16-бит) и формирует из него элемент массива data(4 байта)
{
    unsigned short o_byte, s_byte;
    fread(&s_byte, sizeof(s_byte), 1, file_in);
    fread(&o_byte, sizeof(o_byte), 1, file_in);
    unsigned long var = (o_byte);
    var = (s_byte) | (var << 16);
    data.insert(data.end(), var);
    chunkSize += 4;
    chunk3Size += 4;
    return;
}
 
void AIFF::out(FILE *file_out)//метод выводит получившийся вконце AIFF в файл
{
    fwrite(&chunkId, sizeof(char) * 4, 1, file_out);
    fwrite(&chunkSize, sizeof(chunkSize), 1, file_out);
    fwrite(&formType, sizeof(char) * 4, 1, file_out);
    //
    fwrite(&chunk2Id, sizeof(char) * 4, 1, file_out);
    fwrite(&chunk2Size, sizeof(chunk2Size), 1, file_out);
    fwrite(&numChannels, sizeof(numChannels), 1, file_out);
    fwrite(&numSampleFrames, sizeof(numSampleFrames), 1, file_out);
    fwrite(&sampleSize, sizeof(sampleSize), 1, file_out);
    fwrite(&sampleRate, sizeof(char) * 10, 1, file_out);
    //
 
    fwrite(&chunk3ID, sizeof(char) * 4, 1, file_out);
    fwrite(&chunk3Size, sizeof(chunk3Size), 1, file_out);
    fwrite(&offset, sizeof(offset), 1, file_out);
    fwrite(&blockSize, sizeof(blockSize), 1, file_out);
    for (int i = 0; i < data.size(); i++)
        fwrite(&data[i], sizeof(long), 1, file_out);
    return;
}

main.cpp
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include "aiff.h"
using namespace std;
 
int main()
{
    FILE *file_in, *file_out;
    fopen_s(&file_out, "E:\\coutAiff1.aiff", "wb");
    fopen_s(&file_in, "E:\\sin.raw", "rb");
    AIFF myAiff;
    for (int i = 0; i<400000; i++)
    {
        myAiff.add_by(file_in);
        
    }
 
    myAiff.out(file_out);
    system("PAUSE");
    fclose(file_out);
    return 0;
}

Файл который по итогу получается не читается.
P.S. ещё хотелось бы узнать с помощью каких программ можно просматривать структуру медиа файлов. Hex редактор нормально отображает буквы но вместо цифр у него точки
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 17:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru