Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пытаюсь добавить один файл в конец другого, В чем ошибка? 
:(
    Опции темы
leamas
Дата 9.5.2008, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 2.5.2008

Репутация: нет
Всего: нет



Задача: проиграть несколько разных звуков и записать их в один файл по очереди. 
Пытаюсь это сделать вот так: 
Код


DWORD GenerateWave(DWORD dwWaveFreq, DWORD dwDuration, RIFF **ppRiff)       //генерирует звук 
{     
   const DWORD dwSamplingRate = 44100; 
   const DWORD dwBitsPerSample = 8; 
   const DWORD dwSamplesCount = dwDuration * dwSamplingRate / 1000; 
   const DWORD dwWaveDataLength = dwSamplesCount * dwBitsPerSample / CHAR_BIT; 
   const DWORD dwRiffSize = sizeof(RIFF) + dwWaveDataLength - 1; 

   RIFF *pRiff = (RIFF *)new BYTE[dwRiffSize]; 

   pRiff->rID = FOURCC("RIFF"); 
   pRiff->rLen = sizeof(WAVE) - 1 + dwWaveDataLength; 

   pRiff->rData.wID = FOURCC("WAVE"); 
   pRiff->rData.fID = FOURCC("fmt "); 
   pRiff->rData.nBlockAlign = dwBitsPerSample / CHAR_BIT; 
   pRiff->rData.nChannels = 1; 
   pRiff->rData.nSamplesPerSec = dwSamplingRate; 
   pRiff->rData.FormatSpecific = 8; // hz 
   pRiff->rData.fLen = 16; 
   pRiff->rData.wFormatTag = 1; 
   pRiff->rData.nAvgBytesPerSec = dwSamplingRate * dwBitsPerSample / CHAR_BIT; 
   pRiff->rData.wd.dID = FOURCC("data"); 
   pRiff->rData.wd.dLen = dwWaveDataLength; 
    
   for(DWORD i = 0; i < dwSamplesCount; ++i) 
   { 
      double dCurrTime = i / (double)dwSamplingRate; 
      // Вычисление амплитуды 
      double dAmplitude = sin(dCurrTime * dwWaveFreq * 2 * M_PI); 
      // Нормализация и запись 
      pRiff->rData.wd.dData[i] = (BYTE)(0.5 * (dAmplitude + 1.0) * UCHAR_MAX); 
   } 
   *ppRiff = pRiff;    
   return dwRiffSize; 
} 

void ReleaseWave(RIFF *pRiff) 
{ 
   BYTE *pData = (BYTE *)pRiff; 
   delete [] pData; 
} 

void TempRec(DWORD dwRiffSize)          // создет временный файл 
{ 
     RIFF *pRiff; 
     HANDLE hFile = CreateFile("test.wav", GENERIC_READ | GENERIC_WRITE, 0, 
      NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 

   if (hFile != INVALID_HANDLE_VALUE) 
   { 
      DWORD dwBytes; 
      WriteFile(hFile, pRiff, dwRiffSize, &dwBytes, NULL);  
       CloseHandle(hFile);      
   }    
} 

void Rec (DWORD dwRiffSize)            
{ 
   RIFF *pRiff; 
   RIFF *pBuff = (RIFF *)new BYTE[dwRiffSize]; 
   HANDLE hFile = CreateFile("test.wav",     // открывает test.wav 
   GENERIC_READ,                 // открывает для чтения 
    0,                            // не разделяемый 
    NULL,                         // защита по умолчанию 
    OPEN_EXISTING,                // только существующий файл 
    FILE_ATTRIBUTE_NORMAL,        // атрибуты обычного файла 
    NULL);                       // шаблона атрибутов нет 
  
// Открывает существующий файл или, если файл не существует, 
// то создадет его. 
  
HANDLE hAppend = CreateFile("TWO.wav",   // открывает TWO.wav 
    GENERIC_WRITE,                // открывает для записи 
    FILE_SHARE_READ,              // допустим несколько читателей 
    NULL,                         // защита по умолчанию 
    OPEN_ALWAYS,                  // открывает или создадает 
    FILE_ATTRIBUTE_NORMAL,        // атрибуты обычного файла 
    NULL);                        // шаблона атрибутов нет 

if (hAppend == INVALID_HANDLE_VALUE) 
{ 
    printf("Could not open TWO.wav");    // обработка ошибки 
    return ; 
} 
  
// Добавляет первый файл в конец второго файла. 
// Блокирует второй файл, чтобы предотвратить обращение 
// другого процесса к нему в ходе записи в файл. Деблокирует 
// файл тогда, когда окончиться запись. 
  
do 
{ 
    if (ReadFile(hFile, pBuff, sizeof(pBuff), &dwBytesRead, NULL)) 
    { 
        dwPos = SetFilePointer(hAppend, 0, NULL, FILE_END);        
        LockFile(hAppend, dwPos, 0, dwRiffSize, 0); 
        WriteFile(hAppend, pBuff, dwBytesRead, 
            &dwBytesWritten, NULL); 
        UnlockFile(hAppend, dwPos, 0, dwBytesRead, 0); 
    } 
} while (dwBytesRead == sizeof(pBuff)); 
  
// Закрывает оба файла. 
  
CloseHandle(hFile); 
CloseHandle(hAppend); 

DeleteFile("test.wav");    //удаляет временный 
delete pRiff; 
} 
      
int main(int argc, char* argv[]) 
{ 
    
    DWORD dwRiffSize; 
    RIFF *pRiff;        
    dwRiffSize   =  GenerateWave(900, 1000, &pRiff);     //этот звук пригрывает и записывает 
    PlaySound((const char*)pRiff, 0, SND_MEMORY);     // проигрывает звук  
    TempRec(dwRiffSize);      
    Rec (dwRiffSize); 
    
    dwRiffSize   =  GenerateWave(400, 1000, &pRiff);     //а этот только проигрывает 
    PlaySound((const char*)pRiff, 0, SND_MEMORY);     // проигрывает звук    
    TempRec(dwRiffSize);  
    Rec (dwRiffSize);    

    return 0; 
}  


 второй звук в файл не записывается. Подскажите, пож., где ошибка?
PM MAIL   Вверх
xvr
Дата 12.5.2008, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Разберись с переменными pRiff - их у тебя несколько разных, данные генерируются в одну из них (в main строка 117), а записывается из другой, неинициализированной (TempRec строка 46)

PM MAIL   Вверх
Eugene881118
Дата 11.7.2008, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 4.7.2008

Репутация: нет
Всего: нет



а вы неподскажете как создать заголовок к файлу на яве? что то нигде об этом нет информации. есть какие то класссы но кк ими пользоваться непонятно.
Код

RIFF *pRiff = (RIFF *)new BYTE[dwRiffSize]; 

   pRiff->rID = FOURCC("RIFF"); 
   pRiff->rLen = sizeof(WAVE) - 1 + dwWaveDataLength; 

   pRiff->rData.wID = FOURCC("WAVE"); 
   pRiff->rData.fID = FOURCC("fmt "); 
   pRiff->rData.nBlockAlign = dwBitsPerSample / CHAR_BIT; 
   pRiff->rData.nChannels = 1; 
   pRiff->rData.nSamplesPerSec = dwSamplingRate; 
   pRiff->rData.FormatSpecific = 8; // hz 
   pRiff->rData.fLen = 16; 
   pRiff->rData.wFormatTag = 1; 
   pRiff->rData.nAvgBytesPerSec = dwSamplingRate * dwBitsPerSample / CHAR_BIT; 
   pRiff->rData.wd.dID = FOURCC("data"); 
   pRiff->rData.wd.dLen = dwWaveDataLength;


насколько я понял здесь человек этот заголовок и формирует. 
в разделе по ява и на других форумах молчат как рыба об лед. я в программировании новичок и самому написать пока не получается даже идей нет. этот код  вообще единственный нагуглившийся пример.

Это сообщение отредактировал(а) Eugene881118 - 11.7.2008, 13:59
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0435 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.