Автор работы: Пользователь скрыл имя, 26 Октября 2013 в 14:52, курсовая работа
Сучасні методи звукозапису складається з двох основних частин: аналогового й цифрового. Раніше все записувалося на аналогові носії. Тому були дуже великі втрати при копіюванні з одного накопичувача інформації на інший. Інший мінус чисто аналогових методів полягає в погрішності в управлінні. Один раз повернув ручку потенціометра, ви потім не зможете точно зафіксувати її у вихідне положення.
З приходом цифрових технологій все істотно змінилося і спростилося. Стало можливим копіювання цифрового звукового сигналу, редагувати, копіювати окремі частини, накладати декількох звуків без втрат в якості.
Зараз "аналог" використовується по мінімуму - тільки мікрофони, звукознімачі, кабелі, попередні, мікшери та акустичні системи (колонки). Все інше покладається на плечі комп'ютера.
Цифрові методи не стоять на місці і розвиваються таким же темпом як і раніше.
}
break;
};
case ID_TRACK_VOLUME:
{
pp.SetVolume(SendMessage(hwndT
break;
};
}
break;
case ID_ERROR_PLAY:
EnableWindow(hWndButton[6],
break;
case ID_ERROR_RECORD:
PostQuitMessage (0);
break;
case MM_MCINOTIFY:
if(wParam!=MCI_NOTIFY_ABORTED)
{
if(!pp.NextTrak())
EnableWindow(hWndButton[6],
}
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case ID_BUTTON:
{
if (lParam == STOP )
lParam=(long)hWndButton[4];
if (lParam == (long)hWndButton[0])
{
}
if (lParam == (long)hWndButton[1])
{
}
if (lParam == (long)hWndButton[2])
{
}
if (lParam == (long)hWndButton[3])
{
}
if (lParam == (long)hWndButton[4])
{
}
if (lParam == (long)hWndButton[5])
{
}
if (lParam == (long)hWndButton[6])
{
}
if (lParam == (long)hWndButton[7])
{
}
if (lParam == (long)hWndButton[8])
{
}
if (lParam == (long)hWndButton[9])
{
EnableWindow(hWndButton[6],
}
if (lParam == (long)hWndButton[10])
{
EnableWindow(hWndButton[6],
}
if (lParam == (long)hWndButton[11])
{
EnableWindow(hWndButton[6],
}
}
//break;
default:
return DefWindowProc (hwnd, message, wParam, lParam);
}
break;
case WM_CLOSE:
if (gg.GetStateRecords()!=4)
{
if(!gg.StopRecord())
{
EnableWindow(hWndButton[2],
EnableWindow(hWndButton[1],
break;
}
}
case WM_DESTROY:
PostQuitMessage (0); /* send a WM_QUIT to the message queue */
break;
default: /* for messages that we don't deal with */
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
/*record.h*/
#include <cstdlib>
#include <iostream>
#include "windows.h"
#include "mmsystem.h"
#include "aclapi.h"
enum { ID_ERROR_RECORD=4 };
enum { STOP=5 };
class Record_Sound {
private:
int StateRecords; //статус запису
boolean StateSave;//статус зберігання
HANDLE hEventStart;//дескриптор події
HWAVEIN hWaveIn; //покажчик на ідентифікатор пристрою вводу
int Channel;//кількість каналів
int t;//лічильник кількості секунд запису
public:
Record_Sound();
void Record_();
void Record(); // починає записувати
int GetFreeMemory();
void PauseRecord();// призупиняє запис
void StartRecord();// відновлює запис
int StopRecord(); // припиняє запис
void Save(); // зберігає
int GetTimeRecord(); // отримуємо час запису
int GetStateRecords();
void SetChannel(int Channel);// встановлюємо кількість каналів для запису
};
Record_Sound::Record_Sound(){
StateRecords=1; //стан запису
//1-записувати
//2-пауза
//3-закінчити запис
Channel =1;
t=0;
StateSave=TRUE;
}
unsigned long _stdcall Record_threadstart(void *data)
{
((Record_Sound*)data)->Record_
}
//створює потік для запису
void Record_Sound:: Record()
{
CreateThread(NULL,0,Record_
}
//записуємо
void Record_Sound :: Record_(){
StateSave=FALSE;
WAVEFORMATEX WaveFormat; //структура з параметрами запису
WAVEHDR WaveHdr; // структура для опису буфера і посилання на масив данних що передається
MMRESULT mmRes; //змінна для відтворення коду помилки
DWORD dwCallback; // адреса функції зворотнього виклику
MMIOINFO mmioInfo;//структура для відтворення помилки
char buff[100]; //повідомлення про пимилку
int BufferSize=0; //розмір буфферу
TCHAR serror[256];
string lpFilename=GetCommandLine();
int Position=lpFilename.find_last_
lpFilename.erase(Position+1,
lpFilename.insert(Position+1,"
lpFilename.erase(0,1);
const LPSTR szFileName=(char*)lpFilename.
WaveFormat.wFormatTag = WAVE_FORMAT_PCM; /*лінійно імпульсна кодова модуляція (формат записі)*/
WaveFormat.nChannels =Channel; //кількість каналів
WaveFormat.nSamplesPerSec =32000; //частота дискретизаціїї 8кГц
WaveFormat.wBitsPerSample = 16; // кількість біт на відлік
WaveFormat.nBlockAlign = (WaveFormat.nChannels*
WaveFormat.nAvgBytesPerSec = WaveFormat.nSamplesPerSec*
//створюємо подію для заповнення буферу запису
HANDLE hEvent = CreateEvent(0, TRUE, FALSE, 0);
//відкриваємо пристрій запису звуку
int NumDevs=waveInGetNumDevs();
if (NumDevs!=0)
{
{
WAVEINCAPS wavEincaps;
waveInGetDevCaps(NumDevs-1, &wavEincaps, sizeof(wavEincaps));
}
MMRESULT mmResult= waveInOpen(&hWaveIn,WAVE_
if (mmResult!=MMSYSERR_NOERROR)
{
serror[0]= 0;
waveInGetErrorText(mmResult, serror, sizeof(serror));
MessageBox(NULL,serror,"ERROR"
SendMessage(hwnd,ID_ERROR_
}
BufferSize=WaveFormat.
WaveHdr.lpData = (char*)malloc(BufferSize); //виділяємо пам'ять для запису
WaveHdr.dwBufferLength = BufferSize; //розмір буферу данних
//підготовлюєм буфер для передачі пристрою вводу
mmResult=waveInPrepareHeader(
if (mmResult!=MMSYSERR_NOERROR)
{
serror[0]= 0;
waveInGetErrorText(mmResult, serror,sizeof(serror));
MessageBox(NULL,serror,"ERROR"
SendMessage(hwnd,ID_ERROR_
}
//створюємо файл .wav для запису
HMMIO hMmio = mmioOpen(szFileName, NULL,MMIO_CREATE|MMIO_WRITE);
if (!hMmio)
{
MessageBox(hWnd,"Файл неоткривается","Error ",MB_OK | MB_TASKMODAL);
SendMessage(hwnd,ID_ERROR_
}
else
{
//створення заголовка
MMCKINFO mmCkInfo;
mmCkInfo.ckid = mmioFOURCC('R', 'I', 'F', 'F');
mmCkInfo.fccType = mmioFOURCC('W', 'A', 'V', 'E');
mmCkInfo.dwFlags = MMIO_DIRTY;
mmioCreateChunk(hMmio, &mmCkInfo, MMIO_CREATERIFF);
//створення блоку з інформацією із структури WAVEFORMATEX
mmCkInfo.ckid = mmioFOURCC('f', 'm', 't', ' ');
mmCkInfo.dwFlags = MMIO_DIRTY;
mmCkInfo.cksize = sizeof(WaveFormat);
mmioCreateChunk(hMmio, &mmCkInfo, NULL);
mmioWrite(hMmio,(char*)&
//створення одного блоку з данними
mmCkInfo.ckid = mmioFOURCC('d', 'a', 't', 'a');
mmCkInfo.cksize =BufferSize;
mmCkInfo.dwFlags = MMIO_DIRTY;
mmioCreateChunk(hMmio, &mmCkInfo, NULL);
hEventStart= CreateEvent(0, TRUE, FALSE, 0);
StateRecords=1;
t=0;
if (GetFreeMemory()==0) StateRecords==4;
while(StateRecords!=4)
{
if(StateRecords==2)
{
WaitForSingleObject(hEventStar
ResetEvent(hEventStart);
if(StateRecords==4)break;
}
//передаєм підготовлений
waveInAddBuffer(hWaveIn, &WaveHdr, sizeof(WAVEHDR));
// запускаємо процес вводу данних
if(t==0)
mmResult=waveInStart(hWaveIn);
if (mmResult!=MMSYSERR_NOERROR)
{
serror[0]= 0;
waveInGetErrorText(mmResult, serror,sizeof(serror));
MessageBox(NULL,serror,"ERROR"
SendMessage(hwnd,ID_ERROR_
}
WaitForSingleObject(hEvent,
ResetEvent(hEvent);
mmioWrite(hMmio,WaveHdr.
mmioAscend ( hMmio, &mmCkInfo, 0);
t++;
if (GetFreeMemory()==0) StateRecords==4;
}
if(mmioClose(hMmio,MMIO_
MessageBox(NULL,"Неможливо закрити файл","Error ",MB_OK | MB_TASKMODAL);
hMmio = mmioOpen((char*)lpFilename.c_
if (hMmio)
{
UINT error = GetLastError();
char lpMsgBuf[256];
FormatMessage(FORMAT_MESSAGE_
&lpMsgBuf,sizeof(lpMsgBuf),
MessageBox(NULL,lpMsgBuf,"
}
CloseHandle(hEvent);
CloseHandle(hEventStart);
}
//звільняємо буфер вводу
mmResult=
if (mmResult!=MMSYSERR_NOERROR)
{
serror[0]= 0;
waveInGetErrorText(mmResult, serror,sizeof(serror));
MessageBox(NULL,serror,"ERROR звільнення",MB_OK | MB_TASKMODAL);
}
//закриваємо аудіопристрій
mmResult=waveInClose(hWaveIn);
if (mmResult!=MMSYSERR_NOERROR)
{
serror[0]= 0;
waveInGetErrorText(mmResult, serror,sizeof(serror));
MessageBox(NULL,serror,"ERROR звільнення",MB_OK | MB_TASKMODAL);
}
}
else
{
char *Num;
Num=(char*)malloc(10);
itoa(NumDevs,Num,10);
MessageBox(NULL,Num,"Кількість драйверів що підтримують імпульсно кодову модуляцію",MB_OK | MB_TASKMODAL);
}
}
int Record_Sound :: GetFreeMemory()
{
string dir=GetCommandLine();
int Position=dir.find_first_of("\\
dir.erase(Position+1,dir.
dir.erase(0,1);
__int64 lpTotalNumberOfFreeBytes;
GetDiskFreeSpaceEx(dir.c_str()
while ((lpTotalNumberOfFreeBytes/
{
int Button=MessageBox(NULL,"Невист
if(Button==IDYES)
{
GetDiskFreeSpaceEx(dir.c_str()
Информация о работе Аналіз методів оброблення звукової інформації в еом