/[svn]/linuxsampler/trunk/src/common/RTMath.cpp
ViewVC logotype

Annotation of /linuxsampler/trunk/src/common/RTMath.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 328 - (hide annotations) (download)
Sat Dec 25 21:58:58 2004 UTC (19 years, 4 months ago) by schoenebeck
File size: 3482 byte(s)
* architecture independence fixes, should now compile again for non x86
  systems
* tiny fix of command line switch --version

1 schoenebeck 53 /***************************************************************************
2     * *
3     * LinuxSampler - modular, streaming capable sampler *
4     * *
5 schoenebeck 56 * Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck *
6 schoenebeck 53 * *
7     * This program is free software; you can redistribute it and/or modify *
8     * it under the terms of the GNU General Public License as published by *
9     * the Free Software Foundation; either version 2 of the License, or *
10     * (at your option) any later version. *
11     * *
12     * This program is distributed in the hope that it will be useful, *
13     * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15     * GNU General Public License for more details. *
16     * *
17     * You should have received a copy of the GNU General Public License *
18     * along with this program; if not, write to the Free Software *
19     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
20     * MA 02111-1307 USA *
21     ***************************************************************************/
22    
23     #include "RTMath.h"
24    
25 schoenebeck 319 float RTMathBase::CentsToFreqTable[MAX_PITCH * 1200 * 2 + 1]; // +-1200 cents per octave
26     float* RTMathBase::pCentsToFreqTable(InitCentsToFreqTable());
27 schoenebeck 53
28 schoenebeck 328 /*
29     * Creates a real time stamp for the current moment. Out of efficiency this
30     * is implemented in inline assembly for each CPU independently; we currently
31     * don't use a generic solution for CPUs that are not yet covered by the
32     * assembly code, instead an error message is prompted on compile time, forcing
33     * the user to contact us.
34     */
35     RTMathBase::time_stamp_t RTMathBase::CreateTimeStamp() {
36     #if defined(__i386__) || defined(__x86_64__)
37     uint64_t t;
38     __asm__ __volatile__ ("rdtsc" : "=A" (t));
39     return t >> 8;
40     #elif defined(__ia64__)
41     time_stamp_t t;
42     __asm__ __volatile__ ("mov %0=ar.itc" : "=r"(t));
43     return t;
44     #elif defined(__powerpc__)
45     time_stamp_t t;
46     __asm__ __volatile__ (
47     "98: mftb %0\n"
48     "99:\n"
49     ".section __ftr_fixup,\"a\"\n"
50     " .long %1\n"
51     " .long 0\n"
52     " .long 98b\n"
53     " .long 99b\n"
54     ".previous"
55     : "=r" (t) : "i" (0x00000100)
56     );
57     return t;
58     #elif defined(__alpha__)
59     time_stamp_t t;
60     __asm__ __volatile__ ("rpcc %0" : "=r"(t));
61     return t;
62     #else // we don't want to use a slow generic solution
63     # error "Sorry, LinuxSampler lacks time stamp code for your system."
64     # error "Please report this error and the CPU you are using to the LinuxSampler developers mailing list!"
65     #endif
66     }
67    
68 schoenebeck 53 /**
69     * Will automatically be called once to initialize the 'Cents to frequency
70     * ratio' table.
71     */
72 schoenebeck 319 float* RTMathBase::InitCentsToFreqTable() {
73 schoenebeck 53 float* pMiddleOfTable = &CentsToFreqTable[MAX_PITCH * 1200];
74     for (int i = -1200; i <= 1200; i++) {
75     pMiddleOfTable[i] = pow(TWELVEHUNDREDTH_ROOT_OF_TWO, i);
76     }
77     return pMiddleOfTable;
78     }

  ViewVC Help
Powered by ViewVC