Автор работы: Пользователь скрыл имя, 26 Октября 2013 в 14:52, курсовая работа
Сучасні методи звукозапису складається з двох основних частин: аналогового й цифрового. Раніше все записувалося на аналогові носії. Тому були дуже великі втрати при копіюванні з одного накопичувача інформації на інший. Інший мінус чисто аналогових методів полягає в погрішності в управлінні. Один раз повернув ручку потенціометра, ви потім не зможете точно зафіксувати її у вихідне положення.
З приходом цифрових технологій все істотно змінилося і спростилося. Стало можливим копіювання цифрового звукового сигналу, редагувати, копіювати окремі частини, накладати декількох звуків без втрат в якості.
Зараз "аналог" використовується по мінімуму - тільки мікрофони, звукознімачі, кабелі, попередні, мікшери та акустичні системи (колонки). Все інше покладається на плечі комп'ютера.
Цифрові методи не стоять на місці і розвиваються таким же темпом як і раніше.
if ((lpTotalNumberOfFreeBytes/
}
if(Button==IDCANCEL)
{
SendMessage(hwnd,WM_COMMAND,
return 0;
}
}
return lpTotalNumberOfFreeBytes/
}
//відновлюємо запис
void Record_Sound :: StartRecord()
{
waveInStart(hWaveIn);
SetEvent(hEventStart);
StateRecords=1;
StateSave=FALSE;
}
//призупиняємо запис
void Record_Sound :: PauseRecord(){
StateRecords=2;
waveInStop(hWaveIn);
}
//зупиняємо запис
int Record_Sound :: StopRecord(){
PauseRecord();
if (!StateSave)
{
int Button=MessageBox(NULL,"Файл змінено.Зберігти зміни","Звукозапис",
MB_YESNOCANCEL|MB_ICONWARNING|
if(Button==IDYES)
{
Save();
StateRecords=4;
SetEvent(hEventStart);
}
if(Button==IDNO)
{
StateRecords=4;
SetEvent(hEventStart);
}
if(Button==IDCANCEL)
{
return 0;
}
return 1;
}
return 1;
}
//зберігаємо запис
void Record_Sound :: Save(){
StateRecords=2;
waveInStop(hWaveIn);
OPENFILENAME ofn; // структура стандартного діалогового вікна
char lpNewFileName[65532]; // буфер для імені файлу
// ініціалізація структури OPENFILENAME для діалогового вікна
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.lpstrFile = lpNewFileName;
ofn.nMaxFile = sizeof(lpNewFileName);
ofn.lpstrFilter = "Wav \0*.wav\0All\0*.*\0";
ofn.nFilterIndex = 1;
ofn.lpstrDefExt="wav";
ofn.lpstrFileTitle = NULL;
ofn.lpstrInitialDir="Моя запись";
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_OVERWRITEPROMPT ;
// Показуємо діалогове вікно Зберігти (Save).
if(GetSaveFileName(&ofn)==
{
//отримання імені директорії з програмою
string lpFilename=GetCommandLine();
int Position=lpFilename.find_last_
lpFilename.erase(Position+1,
lpFilename.insert(Position+1,"
lpFilename.erase(0,1);
if(!CopyFile(lpFilename.c_str(
MessageBox(NULL,"Невдається зберігти №1","Error",MB_OK);
}
StateSave=TRUE;
}
//отримання часу запису
int Record_Sound :: GetTimeRecord(){
return t;
}
//отримання стану запису
int Record_Sound :: GetStateRecords()
{
return StateRecords;
}
//задання кількості каналів для запису
void Record_Sound :: SetChannel(int Channel){
this->Channel=Channel;
}
/*play.h*/
#include <cstdlib>
#include <iostream>
#include "windows.h"
#include "mmsystem.h"
#include "vector"
#include <algorithm>
enum { ID_LENGTH };
enum { ID_MOVE=3 };
enum { ID_ERROR_PLAY=77};
//Клас для відтворення звукової інформації
class Play_Sound {
private:
HANDLE hEventStart; //дескриптор події для керування відтворенням
HWAVEIN hWaveIn; //покажчик на ідентифікатор пристрою вводу
MCIERROR mciError;
MCI_OPEN_PARMS mciOpenParms;
MCI_PLAY_PARMS mciPlayParms;
MCI_STATUS_PARMS Info;
int Length;
int Second; // змінна для зв'язку з повзунком
int StatePlay;
char *Path;
int PositionInList;
DWORD Volume;
vector<string>PlayList;
public:
LPDWORD PlayThreadID;//область памяті для повернення ідентифікатору потокау
Play_Sound();
void AddToPlaylist();
int Play();//створює потік для відтворення
void Play_();
int GetStatePlay();
void ResumePlay(); // відновлює відтворення
void Stop(); // зупиняє відтврорення
void Pause(); // призупиняє відтворення
void SetVolume(int Volume);
int GetVolume();
void PlayFrom(int From);
void MoveTrack();
void MoveTrack_();
void SetSecond(int Sec);
int GetLength();
void OfRandom();
void Sort();
int NextTrak();
void PreviousTrak();
};
Play_Sound :: Play_Sound()
{
StatePlay=0; // 0-невідтворює
// 1-відтворює
// 2-пауза
// 3-шукати
mciOpenParms.lpstrDeviceType =0;
PositionInList=0;
Path=NULL;
}
unsigned long _stdcall Play_threadstart(void *data)
{
((Play_Sound*)data)->Play_();
}
//створює потік для відтворення
int Play_Sound:: Play()
{
if (PlayList.size()!=0)
{
Path=(char*)malloc(PlayList[
Path[PlayList[PositionInList].
CreateThread(NULL,0,Play_
return 1;
}
else
return 0;
}
//відтворення
void Play_Sound :: Play_()
{
mciOpenParms.lpstrElementName =Path;
mciError = mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT ,
(DWORD)(LPMCI_OPEN_PARMS)&
if (mciError)
{
char lpszErrorText[256];
BOOL dummy = mciGetErrorString(mciError, lpszErrorText,sizeof(
if (dummy)
{
MessageBox(NULL,lpszErrorText,
if (NextTrak()==0)
SendMessage(hwnd,ID_ERROR_
}
else
MessageBox(NULL,"Напряги извилины :-)","ERROR Can't open",MB_OK);
}
else
{
mciPlayParms.dwCallback=(
mciError = mciSendCommand(mciOpenParms.
MCI_NOTIFY , (DWORD)(LPMCI_PLAY_PARMS)&
if (mciError)
{
char lpszErrorText[256];
BOOL dummy = mciGetErrorString(mciError, lpszErrorText,sizeof(
if (dummy)
{
MessageBox(NULL,lpszErrorText,
}
else
MessageBox(NULL,"Напряги извилины :-)","ERROR Can't play",MB_OK);
}
memset(&Info,0,sizeof(MCI_
Info.dwItem = MCI_STATUS_LENGTH;
mciSendCommand(mciOpenParms.
Length=Info.dwReturn/1000;
Second=0;
SendMessage(hwnd, ID_LENGTH,NULL,NULL);
MoveTrack();
StatePlay=-1;
hEventStart= CreateEvent(0, TRUE, FALSE, 0);
while (true)
{
WaitForSingleObject(
// зупиняє відтворення
if (StatePlay==0)
{
ResetEvent(hEventStart);
break;
}
// призупиняє відтворення
if (StatePlay==2)
{
mciSendCommand(mciOpenParms.
ResetEvent(hEventStart);
}
// відновлює відтворення
if (StatePlay==1)
{
ResetEvent(hEventStart);
mciError = mciSendCommand(mciOpenParms.
if (mciError)
{
char lpszErrorText[256];
BOOL dummy = mciGetErrorString(mciError, lpszErrorText,sizeof(
if (dummy)
{
MessageBox(NULL,lpszErrorText,
}
else
}
}
//відтворює з певного місця
if (StatePlay==3)
{
mciSendCommand(mciOpenParms.
ResetEvent(hEventStart);
}
}
mciError=mciSendCommand(
if (mciError)
{
char lpszErrorText[256];
BOOL dummy = mciGetErrorString(mciError, lpszErrorText,sizeof(
if (dummy)
{
MessageBox(NULL,lpszErrorText,
}
else
MessageBox(NULL,"Can't close напряги извилины :-)","ERROR",MB_OK);
}
}
}
//отримає стан відтворення
int Play_Sound :: GetStatePlay()
{
return StatePlay;
}
//зупиняє відтворення
void Play_Sound :: Stop()
{
StatePlay=0;
SetEvent(hEventStart);
}
//призупиняє відтворення
void Play_Sound :: Pause()
{
if (StatePlay!=2)
{
StatePlay=2;
SetEvent(hEventStart);
}
}
//відновлюєвідтворення
void Play_Sound :: ResumePlay()
{
StatePlay=1;
SetEvent(hEventStart);
}
//задає гучність звуку
void Play_Sound :: SetVolume(int VolumeV)
{
Volume=VolumeV*1000;
waveOutSetVolume(0,MAKELPARAM(
}
//повертає гучність
int Play_Sound :: GetVolume()
{
waveOutGetVolume(0,&Volume);
Volume=LOWORD(Volume);
Volume=Volume/1000;
if (Volume==0)Volume=1;
return Volume;
}
//відтворює з певного місця
void Play_Sound :: PlayFrom(int From)
{
mciPlayParms.dwFrom = From*1000;
StatePlay=3;
SetEvent(hEventStart);
}
//функцію яку визиває потік переміщення повзунка
unsigned long _stdcall Play_threadMoveTrack(void *data)
{
((Play_Sound*)data)->
}
//створює потік для переміщення повзунок
void Play_Sound :: MoveTrack()
{
CreateThread(NULL,0,Play_
}
//переміщює повзунок
void Play_Sound :: MoveTrack_()
{
while (Second!=GetLength())
{
if (StatePlay==2)
WaitForSingleObject(
if (StatePlay==0)
{
SendMessage(hwnd,ID_MOVE, NULL,0);
break;
}
Sleep(1000);
Second++;
SendMessage(hwnd,ID_MOVE, NULL,(LPARAM)Second);
}
}
//зписує теперішню позицію повзунка
void Play_Sound :: SetSecond(int Sec)
{
Second=Sec;
}
//повертає довжину треку
int Play_Sound :: GetLength()
{
return Length;
}
//розміщає назви треків в довільній послідовності
void Play_Sound :: OfRandom()
{
random_shuffle(PlayList.begin(
}
//відсортовує назви треків
void Play_Sound :: Sort()
{
sort(PlayList.begin(),
}
//вітворення наступного треку
int Play_Sound :: NextTrak()
{
if (PlayList.size()>1)
{
Stop();
if (PositionInList==PlayList.
PositionInList=0;
else
PositionInList++;
Play();
return 1;
}
return 0;
}
//відтворення попереднього треку
void Play_Sound :: PreviousTrak()
{
if (PlayList.size()>1)
{
Stop();
if (PositionInList==0)
PositionInList=PlayList.size()
else
PositionInList--;
Play();
}
}
//додає до списку відтворення
void Play_Sound :: AddToPlaylist()
{
OPENFILENAME ofn;
char lpNewFileName[65532];
// ініціалізація структури OPENFILENAME для діалогового вікна
ofn.hwndOwner=hwnd;
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.lpstrFile = lpNewFileName;
ofn.nMaxFile = sizeof(lpNewFileName);
ofn.lpstrFilter = "Wav Mp3\0*.wav;*.mp3\0All\0*.*\0";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST|OFN_
// показуємо діалогове вікно Відкрити (Open).
if (GetOpenFileName(&ofn)==TRUE)
{
int i;
string Buff;
string Buff2;
char *Temp;
int nOffset = ofn.nFileOffset;
Buff.insert(0,ofn.lpstrFile);
if (nOffset > lstrlen(ofn.lpstrFile))
{
while(ofn.lpstrFile[nOffset]!=
{
string Buff2;
Buff2.insert(0,Buff);
Buff2.insert(Buff2.size(),"\\"
Buff2.insert(Buff2.size(),ofn.
PlayList.push_back(Buff2);
nOffset +=strlen(ofn.lpstrFile+
}
}
else
{
PlayList.push_back(Buff);
}
OfRandom();
}
}
Рисунок В.1 – Схема алгоритму запису
Рисунок В.2 – Схема алгоритму відтворення
Рисунок В.3 – Схема алгоритму додавання до списку відтворення
Рисунок В.4 – Схема алгоритму сортування списку відтворення
Информация о работе Аналіз методів оброблення звукової інформації в еом