Skip to content

Commit

Permalink
Improved wav duration calculation - now supports sample rates other t…
Browse files Browse the repository at this point in the history
…han 11025.

Bumped build tool version to VS2019.
  • Loading branch information
k4zmu2a committed Aug 18, 2021
1 parent dcd488c commit d5b44e4
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 11 deletions.
10 changes: 5 additions & 5 deletions SpaceCadetPinball/SpaceCadetPinball.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -23,32 +23,32 @@
<ProjectGuid>{F7B78CC7-6984-4F79-9486-ABCF87DF9F06}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>SpaceCadetPinball</RootNamespace>
<WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>NotSet</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>NotSet</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>NotSet</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>NotSet</CharacterSet>
</PropertyGroup>
Expand Down
7 changes: 5 additions & 2 deletions SpaceCadetPinball/loader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,8 @@ int loader::get_sound_id(int groupIndex)

if (!sound_list[soundIndex].Loaded && !sound_list[soundIndex].WavePtr)
{
WaveHeader wavHeader{};

int soundGroupId = sound_list[soundIndex].GroupIndex;
sound_list[soundIndex].Duration = 0.0;
if (soundGroupId > 0 && !pinball::quickFlag)
Expand All @@ -150,9 +152,10 @@ int loader::get_sound_id(int groupIndex)
pinball::make_path_name(filePath, fileName2);

HFILE hFile = _lopen(filePath, 0);
sound_list[soundIndex].Duration = static_cast<float>(static_cast<double>(_llseek(hFile, 0, SEEK_END)) *
0.0000909090909090909);
_lread(hFile, &wavHeader, sizeof wavHeader);
_lclose(hFile);
auto sampleCount = wavHeader.data_size / (wavHeader.channels * (wavHeader.bits_per_sample / 8.0));
sound_list[soundIndex].Duration = static_cast<float>(sampleCount / wavHeader.sample_rate);
sound_list[soundIndex].WavePtr = Sound::LoadWaveFile(filePath);
}
}
Expand Down
34 changes: 34 additions & 0 deletions SpaceCadetPinball/loader.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,40 @@ struct visualStruct
zmap_header_type* ZMap;
};

#pragma pack(push)
#pragma pack(1)
// WAVE file header format
struct WaveHeader
{
unsigned char riff[4]; // RIFF string

unsigned int overall_size; // overall size of file in bytes

unsigned char wave[4]; // WAVE string

unsigned char fmt_chunk_marker[4]; // fmt string with trailing null char

unsigned int length_of_fmt; // length of the format data

unsigned short format_type; // format type. 1-PCM, 3- IEEE float, 6 - 8bit A law, 7 - 8bit mu law

unsigned short channels; // no.of channels

unsigned int sample_rate; // sampling rate (blocks per second)

unsigned int byterate; // SampleRate * NumChannels * BitsPerSample/8

unsigned short block_align; // NumChannels * BitsPerSample/8

unsigned short bits_per_sample; // bits per sample, 8- 8bits, 16- 16 bits etc

unsigned char data_chunk_header[4]; // DATA string or FLLR string

unsigned int data_size; // NumSamples * NumChannels * BitsPerSample/8 - size of the next chunk that will be read
};
#pragma pack(pop)
static_assert(sizeof(WaveHeader) == 44, "Wrong size of WaveHeader");


class loader
{
Expand Down
6 changes: 3 additions & 3 deletions SpaceCadetPinball/midi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
#include "pinball.h"

tagMCI_OPEN_PARMSA midi::mci_open_info;
char midi::midi_device_type[28];
char midi::midi_file_name[28];
HWND midi::midi_notify_hwnd;
int midi::midi_seq1_open, midi::midi_seq1_playing;

Expand Down Expand Up @@ -53,8 +53,8 @@ int midi::music_init(HWND hwnd)

mci_open_info.wDeviceID = 0;
midi_notify_hwnd = hwnd;
lstrcpyA(midi_device_type, pinball::get_rc_string(156, 0));
mci_open_info.lpstrElementName = midi_device_type;
lstrcpyA(midi_file_name, pinball::get_rc_string(156, 0));
mci_open_info.lpstrElementName = midi_file_name;
mci_open_info.lpstrDeviceType = nullptr;
auto result = mciSendCommandA(0, MCI_OPEN, MCI_OPEN_ELEMENT | MCI_NOTIFY_SUPERSEDED, (DWORD_PTR)&mci_open_info);
midi_seq1_open = result == 0;
Expand Down
2 changes: 1 addition & 1 deletion SpaceCadetPinball/midi.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ class midi
static void music_shutdown();
private:
static tagMCI_OPEN_PARMSA mci_open_info;
static char midi_device_type[28];
static char midi_file_name[28];
static HWND midi_notify_hwnd;
static int midi_seq1_open, midi_seq1_playing;

Expand Down

0 comments on commit d5b44e4

Please sign in to comment.