Skip to content

Commit

Permalink
* The WAV header is now created correctly (mixed up endian of the fou…
Browse files Browse the repository at this point in the history
…rcc members)

* More or less fixed reading - it now works nicely when you copy the file to the
  hard drive first, but MediaPlayer cannot handle the files directly from CD for
  some reason yet to investigate.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21153 a95241bf-73f2-0310-859d-f6bbb57e9c96
  • Loading branch information
axeld committed May 16, 2007
1 parent 5d2e404 commit 8536d82
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 19 deletions.
13 changes: 7 additions & 6 deletions src/add-ons/kernel/file_systems/cdda/cdda.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -413,15 +413,15 @@ dump_toc(scsi_toc_toc *toc)


static status_t
read_frames(int fd, off_t frame, uint8 *buffer, size_t count)
read_frames(int fd, off_t firstFrame, uint8 *buffer, size_t count)
{
size_t framesLeft = count;

while (framesLeft > 0) {
scsi_read_cd read;
read.start_m = frame / kFramesPerMinute;
read.start_s = (frame / kFramesPerSecond) % 60;
read.start_f = frame % kFramesPerSecond;
read.start_m = firstFrame / kFramesPerMinute;
read.start_s = (firstFrame / kFramesPerSecond) % 60;
read.start_f = firstFrame % kFramesPerSecond;

read.length_m = count / kFramesPerMinute;
read.length_s = (count / kFramesPerSecond) % 60;
Expand All @@ -445,7 +445,7 @@ read_frames(int fd, off_t frame, uint8 *buffer, size_t count)

buffer += count * kFrameSize;
framesLeft -= count;
frame += count;
firstFrame += count;
}

return B_OK;
Expand Down Expand Up @@ -618,14 +618,15 @@ read_cdda_data(int fd, off_t offset, void *data, size_t length,
if (status < B_OK)
return status;

off_t dataOffset = offset - frame * kFrameSize;
off_t dataOffset = offset % kFrameSize;
size_t bytes = bufferSize - dataOffset;
if (bytes > length)
bytes = length;

if (user_memcpy(data, (uint8 *)buffer + dataOffset, bytes) < B_OK)
return B_BAD_ADDRESS;

data = (void *)((uint8 *)data + bytes);
length -= bytes;
offset += bytes;
}
Expand Down
25 changes: 12 additions & 13 deletions src/add-ons/kernel/file_systems/cdda/kernel_interface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -317,11 +317,8 @@ Volume::Mount(const char* device)
+ next.second * kFramesPerSecond + next.frame
- startFrame;

const char *artist = text.artists[i] != NULL
? text.artists[i] : text.artist;

if (text.titles[i] != NULL) {
if (artist != NULL) {
if (text.artists[i] != NULL) {
snprintf(title, sizeof(title), "%02ld. %s - %s.wav", track,
text.artists[i], text.titles[i]);
} else {
Expand All @@ -346,7 +343,8 @@ Volume::Mount(const char* device)

// add attributes

inode->AddAttribute("Audio:Artist", B_STRING_TYPE, artist);
inode->AddAttribute("Audio:Artist", B_STRING_TYPE,
text.artists[i] != NULL ? text.artists[i] : text.artist);
inode->AddAttribute("Audio:Title", B_STRING_TYPE, text.titles[i]);
inode->AddAttribute("Audio:Genre", B_STRING_TYPE, text.genre);
inode->AddAttribute("Audio:Track", track);
Expand Down Expand Up @@ -582,13 +580,13 @@ Inode::Inode(Volume *volume, Inode *parent, const char *name, off_t start,
// initialize WAV header

// RIFF header
fWAVHeader.header.magic = B_HOST_TO_LENDIAN_INT32('RIFF');
fWAVHeader.header.magic = B_HOST_TO_BENDIAN_INT32('RIFF');
fWAVHeader.header.length = B_HOST_TO_LENDIAN_INT32(Size()
+ sizeof(wav_header) - sizeof(riff_chunk));
fWAVHeader.header.id = B_HOST_TO_LENDIAN_INT32('WAVE');
fWAVHeader.header.id = B_HOST_TO_BENDIAN_INT32('WAVE');

// 'fmt ' format chunk
fWAVHeader.format.fourcc = B_HOST_TO_LENDIAN_INT32('fmt ');
fWAVHeader.format.fourcc = B_HOST_TO_BENDIAN_INT32('fmt ');
fWAVHeader.format.length = B_HOST_TO_LENDIAN_INT32(
sizeof(wav_format_chunk) - sizeof(riff_chunk));
fWAVHeader.format.format_tag = B_HOST_TO_LENDIAN_INT16(1);
Expand All @@ -600,7 +598,7 @@ Inode::Inode(Volume *volume, Inode *parent, const char *name, off_t start,
fWAVHeader.format.bits_per_sample = B_HOST_TO_LENDIAN_INT16(16);

// 'data' chunk
fWAVHeader.data.fourcc = B_HOST_TO_LENDIAN_INT32('data');
fWAVHeader.data.fourcc = B_HOST_TO_BENDIAN_INT32('data');
fWAVHeader.data.length = B_HOST_TO_LENDIAN_INT32(Size());
}
}
Expand Down Expand Up @@ -1054,8 +1052,6 @@ cdda_read(fs_volume _volume, fs_vnode _node, fs_cookie _cookie, off_t offset,

if (S_ISDIR(inode->Type()))
return B_IS_A_DIRECTORY;
if ((cookie->open_mode & O_RWMASK) != O_RDONLY)
return B_NOT_ALLOWED;
if (offset < 0)
return B_BAD_VALUE;

Expand Down Expand Up @@ -1088,12 +1084,15 @@ cdda_read(fs_volume _volume, fs_vnode _node, fs_cookie _cookie, off_t offset,
if (user_memcpy(buffer, (uint8 *)inode->WAVHeader() + offset, size) < B_OK)
return B_BAD_ADDRESS;

buffer = (void *)((uint8 *)buffer + size);
length -= size;
}
offset = 0;
} else
offset -= sizeof(wav_header);

if (length > 0) {
// read actual CD data
offset -= sizeof(wav_header);
offset += inode->StartFrame() * kFrameSize;

status = read_cdda_data(volume->Device(), offset, buffer, length,
cookie->buffer_offset, cookie->buffer, volume->BufferSize());
Expand Down

0 comments on commit 8536d82

Please sign in to comment.